牛客小白月赛87 A-G 题解 | JorbanS

文章目录

A - 小苯的石子游戏

cpp 复制代码
string solve() {
    cin >> n;
    for (int i = 0; i < n; i ++) cin >> a[i];
    int A = 0, B = 0, mode = 0;
    for (int i = n - 1; i >= 0; i --, mode ^= 1)
        if (mode & 1) B += a[i];
        else A += a[i];
    return A > B ? "Alice" : "Bob";
}

B - 小苯的排序疑惑

cpp 复制代码
string solve() {
    cin >> n;
    for (int i = 0; i < n; i ++) cin >> a[i], b[i] = a[i];
    sort(a, a + n);
    return a[0] == b[0] || a[n - 1] == b[n - 1] ? yes : no;
}

C - 小苯的IDE括号问题(easy)

双指针

cpp 复制代码
void solve() {
    cin >> n >> m >> s;
    int l = s.find('I') - 1, r = l + 2;
    while (m --) {
        string op; cin >> op;
        if (op[0] == 'b') {
            if (l != -1) {
                if (r != n && s[l] == '(' && s[r] == ')') r ++;
                l --;
            }
        } else {
            if (r != n) r ++;
        }
    }
    for (int i = 0; i <= l; i ++) cout << s[i];
    cout << 'I';
    for (int i = r; i < n; i ++) cout << s[i];
    cout << endl;
}

D - 小苯的IDE括号问题(hard)

用两个栈模拟

cpp 复制代码
void solve() {
    cin >> n >> m >> s;
    int idx = s.find('I');
    stack<char> l, r, t;
    for (int i = 0; i < idx; i ++) l.push(s[i]);
    for (int i = n - 1; i > idx; i --) r.push(s[i]);
    while (m --) {
        string op; cin >> op;
        if (op[0] == 'b') {
            if (!l.empty()) {
                if (!r.empty() && l.top() == '(' && r.top() == ')') r.pop();
                l.pop();
            }
        } else if (op[0] == 'd') {
            if (!r.empty()) r.pop();
        } else if (op[0] == '<') {
            if (!l.empty()) {
                r.push(l.top());
                l.pop();
            }
        } else {
            if (!r.empty()) {
                l.push(r.top());
                r.pop();
            }
        }
    }
    while (!l.empty()) t.push(l.top()), l.pop();
    while (!t.empty()) cout << t.top(), t.pop();
    cout << 'I';
    while (!r.empty()) cout << r.top(), r.pop();
    cout << endl;
}

E - 小苯的数组构造

贪心,让 a i + b i = m a x j = 1 i − 1 a j ai+bi=max_{j=1}^{i-1}a_j ai+bi=maxj=1i−1aj

cpp 复制代码
void solve() {
    cin >> n;
    for (int i = 0; i < n; i ++) cin >> a[i];
    int Max = -1e9;
    for (int i = 0; i < n; i ++) {
        b[i] = max(0, Max - a[i]);
        Max = max(Max, a[i]);
    }
    for (int i = 0; i < n; i ++) cout << b[i] << ' ';
    cout << endl;
}

F - 小苯的数组切分

由于一个数如果给 ∣ | ∣ 操作只会多不会少,但是给 & \& & 操作只会少不会多,因此贪心地让 & \& & 操作只包含 a n an an,接下来遍历一下前两个操作的分界点即可

cpp 复制代码
ll solve() {
    cin >> n;
    for (int i = 1; i <= n; i ++) cin >> a[i], b[i] = a[i] ^ b[i - 1];
    ll res = 0, cnt = a[n - 1];
    for (int i = n - 2; i; i --) {
        res = max(res, cnt + b[i]);
        cnt |= a[i];
    }
    return res + a[n];
}

G - 小苯的逆序对

树状数组维护逆序对, f i = n u m i ∣ a r r k − f 2 i − f 3 i − ... f ⌊ n i ⌋ i fi=num_{i|arrk}-f2i-f3i-...f\\left \\lfloor \\frac n i \\right \\rfloor i fi=numi∣arrk−f2i−f3i−...f⌊in⌋i

其中逆序操作保证 f 2 i , f 3 i , ... ... f ⌊ n i ⌋ i f2i,~f3i,~......~f\\left \\lfloor \\frac n i \\right \\rfloor i f2i, f3i, ...... f⌊in⌋i 是已经求得的

cpp 复制代码
ll f[N];

struct BIT {
    int tr[N];

    inline int lowbit(int x) { return x & -x; }

    void modify(int x, int k) {
        while (x) tr[x] += k, x -= lowbit(x);
    }

    int query(int x) {
        int res = 0;
        while (x <= n) res += tr[x], x += lowbit(x);
        return res;
    }
} bit;

ll solve() {
    cin >> n;
    for (int i = 1; i <= n; i ++) {
        int x; cin >> x;
        a[x] = i;
    }
    for (int i = n; i; i --) {
        for (int j = i; j <= n; j += i) {
            f[i] += bit.query(a[j]);
            bit.modify(a[j], 1);
        }
        for (int j = i; j <= n; j += i) {
            bit.modify(a[j], -1);
            if (j != i) f[i] -= f[j];
        }
    }
    return f[1];
}
相关推荐
一个王同学7 分钟前
从零到一 | CV转多模态大模型 | week17 | LLM 推理优化 & vLLM 详解
人工智能·深度学习·算法·机器学习·计算机视觉·vllm
旖-旎1 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
变量未定义~2 小时前
单调栈+倍增思想 皇家守卫【算法赛】、单调队列 附近最小
算法
QN1幻化引擎2 小时前
给 AI 做一次「意识体检」——基于 QN1 幻化引擎的灵鉴意识识别框架与 DalinX V5 实测
大数据·数据结构·人工智能·算法·架构
拂拉氏2 小时前
【知识讲解】 AVL树从基本成员的介绍到核心接口的实现(插入、判断、删除等等)
数据结构·算法·avl树
可靠的仙人掌3 小时前
SAC(Soft Actor-Critic)算法底座
开发语言·算法·php
c238563 小时前
《动态规划:从“傻傻穷举”到“过目不忘”的修仙之路》
c++·算法·动态规划
海石4 小时前
单调栈复健,顺便,牺牲一下吧,空间复杂度!一切献给AC
算法·leetcode
海石4 小时前
JS击败94%,Hard题想不到动态规划,那就用数组和栈试试
算法·leetcode
码少女5 小时前
数据结构——希尔排序
数据结构·排序算法