萌新刚学cdq,WA0
查看原帖
萌新刚学cdq,WA0
184549
RedreamMer楼主2021/2/10 22:24
#include <bits/stdc++.h>
using namespace std;

int a, b, p[N + 10], ans[N + 10], Ans;
struct node
{
    int val, T, id;
    bool operator<(const node &o) const
    {
        return T > o.T;
    }
} s[N + 10];

inline void add(int n, int k)
{
    for (; n <= a; n += n & -n)
        p[n] += k;
}

inline int query(int n)
{
    int res = 0;
    for (; n; n -= n & -n)
        res += p[n];
    return res;
}

inline void cdq(int l, int r)
{
    if (l == r)
        return;
    int mid = (l + r) >> 1;
    cdq(l, mid);
    cdq(mid + 1, r);
    sort(s + l, s + r + 1);
    int tmp = 0;
    for (int i = l; i <= r; i++)
        if (s[i].id <= mid)
            add(s[i].val, 1), tmp++;
        else
        {
            if (s[i].T != 1e18)
                ans[s[i].T] += tmp - query(s[i].val);
            // else
            //     Ans += tmp - query(s[i].val);
        }
    for (int i = l; i <= r; i++)
        if (s[i].id <= mid)
            add(s[i].val, -1);
    for (int i = l; i <= r; i++)
        if (s[i].id > mid)
            add(s[i].val, 1);
        else
        {
            if (s[i].T != 1e18)
                ans[s[i].T] += query(s[i].val);
            // else
            //     Ans += query(s[i].val);
        }
    for (int i = l; i <= r; i++)
        if (s[i].id > mid)
            add(s[i].val, -1);
}

signed main()
{
    freopen("in1.in", "r", stdin);
    a = read();
    b = read();
    for (int i = 1; i <= a; i++)
        s[i].val = read(), s[i].T = 1e18, s[i].id = i;
    for (int i = 1; i <= b; i++)
        s[read()].T = i;
    int tmp = 0;
    for (int i = 1; i <= a; i++)
        if (s[i].T == 1e18)
            Ans += tmp - query(s[i].val), add(s[i].val, 1), tmp++;
    memset(p, 0, sizeof(p));
    cdq(1, a);
    for (int i = b; i >= 1; i--)
        ans[i] += ans[i + 1];
    for (int i = 1; i <= b; i++)
        printf("%lld\n", ans[i] + Ans);
    return 0;
}

第一个数据点和标准答案就差一点,但实在找不到哪里错了QwQ

2021/2/10 22:24
加载中...