AC 但样例没过???
查看原帖
AC 但样例没过???
1129046
lkrkerry楼主2024/8/16 16:25
#include <bits/stdc++.h>
#define int long long

using namespace std;

inline constexpr int lb(int x) { return x & -x; }

struct segmant
{
    struct node
    {
        int val = 0, l = 0, r = 0;
        node(int val = 0, int l = 0, int r = 0) : val(val), l(l), r(r) {}
    };
    vector<node> tr;
    int rt;
    segmant() : tr(1) { rt = addn(0); }
    inline int addn(int va = 0)
    {
        tr.emplace_back(va);
        auto sz = tr.size();
        return sz - 1;
    }
    inline void update(int x) { tr[x].val = tr[tr[x].l].val + tr[tr[x].r].val; }
    inline int incr(int x, int l, int r, int p, int v)
    {
        if (!x)
            x = addn();
        if (l == r)
            return tr[x].val += v, x;
        int m = (l + r) >> 1;
        if (p <= m)
            tr[x].l = incr(tr[x].l, l, m, p, v);
        else
            tr[x].r = incr(tr[x].r, m + 1, r, p, v);
        update(x);
        return x;
    }
    inline int query(int x, int l, int r, int L, int R)
    {
        if (!x)
            return 0;
        if (L <= l && r <= R)
            return tr[x].val;
        int m = (l + r) >> 1;
        if (R <= m)
            return query(tr[x].l, l, m, L, R);
        else if (L > m)
            return query(tr[x].r, m + 1, r, L, R);
        return query(tr[x].l, l, m, L, R) + query(tr[x].r, m + 1, r, L, R);
    }
};
struct bit2
{
    int n;
    vector<segmant> tr;
    bit2(int n) : n(n), tr(n + 1) {}
    inline void incr(int p, int x, int v)
    {
        for (int i = p; i <= n; i += lb(i))
            tr[i].incr(tr[i].rt, 1, n, x, v);
    }
    inline int query(int p, int L, int R)
    {
        int ans = 0;
        for (int i = p; i; i -= lb(i))
            ans += tr[i].query(tr[i].rt, 1, n, L, R);
        return ans;
    }
};

template <typename T>
inline void fr(T &num)
{
    num = 0;
    short sign = 1;
    char ch = std::getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            sign = -1;
        ch = std::getchar();
    }
    while (ch >= '0' && ch <= '9')
        num = num * 10 + ch - '0', ch = getchar();
    num = num * sign;
}
template <typename T>
inline void fw(T x)
{
    if (x < 0)
        std::putchar('-'), x = -x;
    if (x > 9)
        fw(x / 10);
    std::putchar(x % 10 + '0');
}

signed main()
{
//	freopen("d.txt","w",stdout);
    int n, m;
    fr(n), fr(m);
    bit2 bt2(n);
    int ans = 0;
    vector<int> ulk(n + 1);
    for (int i = 1; i <= n; i++)
    {
        int x;
        fr(x);
        bt2.incr(i, x, 1);
        ans += bt2.query(n, x + 1, n);
        ulk[x] = i;
    }
    for (int i = 1; i <= m; i++)
    {
        fw(ans), putchar('\n');
        int x;
        fr(x);
        ans -= bt2.query(ulk[x] - 1, x + 1, n);
        ans -= (bt2.query(n, 1, x - 1) - bt2.query(ulk[x], 1, x - 1));
        bt2.incr(ulk[x], x, -1);
    }
    return 0;
}
2024/8/16 16:25
加载中...