求助 70pts
查看原帖
求助 70pts
406941
Register_int-std=c++14楼主2022/11/13 14:11

救救孩子吧真的调不出来了

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MAXN = 2e4 + 10;
const int MAXM = 1.5e2 + 10;

int c[MAXN];

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

inline 
void add(int k) {
    for (int i = k; i <= 2e4; i += lowbit(i)) c[i]++;
}

inline 
int query(int k) {
    int res = 0;
    for (int i = k; i; i -= lowbit(i)) res += c[i];
    return res;
}

int a[MAXN], b[MAXN], len, tot, num;

int l[MAXM], r[MAXM], belong[MAXN];

vector<int> v[MAXM];

ll ans;

inline 
void init(int n) {
    memcpy(b, a, sizeof a), sort(b + 1, b + n + 1), num = unique(b + 1, b + n + 1) - b - 1;
    for (int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + num + 1, a[i]) - b;
    for (int i = n; i; i--) ans += query(a[i] - 1), add(a[i]);
    len = sqrt(n), tot = (n - 1) / len + 1;
    for (int i = 1; i <= tot; i++) l[i] = r[i - 1] + 1, r[i] = i * len; r[tot] = n;
    for (int i = 1; i <= tot; i++) {
        for (int j = l[i]; j <= r[i]; j++) belong[j] = i, v[i].push_back(a[j]);
        sort(v[i].begin(), v[i].end());
    }
}

inline 
void change(int ql, int qr) {
    if (belong[ql] != belong[qr]) {
        v[belong[ql]].erase(lower_bound(v[belong[ql]].begin(), v[belong[ql]].end(), a[ql]));
        v[belong[ql]].insert(upper_bound(v[belong[ql]].begin(), v[belong[ql]].end(), a[qr]), a[qr]);
        v[belong[qr]].erase(lower_bound(v[belong[qr]].begin(), v[belong[qr]].end(), a[qr]));
        v[belong[qr]].insert(upper_bound(v[belong[qr]].begin(), v[belong[qr]].end(), a[ql]), a[ql]);
    }
    swap(a[ql], a[qr]);
}

inline 
ll query(int ql, int qr, int k) {
    if (ql > qr) return 0;
    int p = belong[ql], q = belong[qr], res = 0;
    if (p == q) {
        for (int i = ql; i <= qr; i++) res += (a[i] < k);
        return res;
    }
    for (int i = ql; i <= r[p]; i++) res += (a[i] < k);
    for (int i = p + 1; i <= q - 1; i++) res += lower_bound(v[i].begin(), v[i].end(), k) - v[i].begin();
    for (int i = l[q]; i <= qr; i++) res += (a[i] < k);
    return res;
}

int n, q, ql, qr;

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]); init(n);
    printf("%lld\n", ans);
    for (scanf("%d", &q); q--;) {
        scanf("%d%d", &ql, &qr);
        if (ql > qr) swap(ql, qr);
        if (a[ql] == a[qr]) { printf("%lld\n", ans); continue; }
        ans += query(ql + 1, qr - 1, a[qr]) - query(ql + 1, qr - 1, a[ql]) << 1;
        a[ql] < a[qr] ? ans++ : ans--, change(ql, qr);
        printf("%lld\n", ans);
    }
}
2022/11/13 14:11
加载中...