萌新刚学cdq分治
查看原帖
萌新刚学cdq分治
110319
LYR_楼主2021/10/6 17:57

样例都过不了

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int M = 2e5 + 10;
inline int rd() {
    int x = 0, f = 1; char ch = getchar();
    while (ch < '0' || ch > '9') {if (ch == '-') f = -1; ch = getchar();}
    while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
    return x * f;
}
int n, k;
struct node {
    int a, b, c, id;
} p[N], tmp[N];
int C[M], cnt[N], ans[N];
bool cmp(const node &x, const node &y) {
    return x.a < y.a;
}
int lowbit(int x) {
    return x & (-x);
}
void update(int x, int v) {
    for (int i = x; i <= k; i += lowbit(i)) {
        C[i] += v;
    }
}
int query(int x) {
    int res = 0;
    for (int i = x; i > 0; i -= lowbit(i)) {
        res += C[i];
    }
    return res;
}
void solve(int l, int r) {
    if (l >= r) return;
    int mid = (l + r) >> 1, i = l, j = mid + 1, tot = l;
    solve(l, mid); solve(mid + 1, r);
    while (i <= mid || j <= r) {
        if (i <= mid && (j > r || p[i].b <= p[j].b)) {
            tmp[tot++] = p[i];
            update(p[i++].c, 1);
        }
        else {
            tmp[tot++] = p[j];
            cnt[p[j].id] += query(p[j++].c - 1);
        }
    }
    for (i = l; i <= mid; i++) update(p[i].c, -1);
    for (i = l; i <= r; i++) p[i] = tmp[i];
}
int main() {
    n = rd(); k = rd();
    for (int i = 1; i <= n; i++) p[i] = {rd(), rd(), rd(), i};
    sort(p + 1, p + n + 1, cmp);
    solve(1, n);
    for (int i = 1; i <= n; i++) ans[cnt[i]]++;
    for (int i = 0; i < n; i++) cout << ans[i] << endl;
    cout << endl;
    return 0;
}
2021/10/6 17:57
加载中...