陌上花开

cdq分治模板题

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#define M 1000100
using namespace std;
int tree[M << 2], num[M], n,k,tot;
struct F {
    int x,y,z,cnt,ans;
} f[M];
int read() {
    int nm = 0, f = 1;
    char c = getchar();
    for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
    for(; isdigit(c); c  =getchar()) nm = nm * 10 + c - '0';
    return nm * f;
}
bool cmp1(F a, F b) {
    if(a.x < b.x) return 1;
    if(a.x > b.x) return 0;
    if(a.y < b.y) return 1;
    if(a.y > b.y) return 0;
    return a.z < b.z;
}

bool cmp2(F a, F b) {
    if(a.y < b.y) return 1;
    if(a.y > b.y) return 0;
    if(a.z < b.z) return 1;
    if(a.z > b.z) return 0;
    return a.x < b.x;
}

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

void modify(int x, int v) {
    while(x <= k) {
        tree[x] += v;
        x += lowbit(x);
    }
}

int ask(int x) {
    int sum = 0;
    while(x) {
        sum += tree[x];
        x -= lowbit(x);
    }
    return sum;
}

void cdq(int l, int r) {
    if(l == r) {
        f[l].ans += f[l].cnt - 1;
        return;
    }
    int mid = (l + r) >> 1;
    cdq(l, mid);
    cdq(mid + 1, r);
    sort(f + l, f + mid + 1, cmp2);
    sort(f + mid + 1, f + r + 1, cmp2);
    int j = l;
    for(int i = mid + 1; i <= r; i++) {
        while(j <= mid && f[j].y <= f[i].y)
            modify(f[j].z, f[j].cnt), j++;
        f[i].ans += ask(f[i].z);
    }
    for(int i = l; i < j; i++) modify(f[i].z, -f[i].cnt);
}

int main() {
    n = read(), k = read();
    for(int i = 1; i <= n; i++) f[i].x = read(), f[i].y = read(), f[i].z = read(), f[i].ans = 1;
    sort(f + 1, f + n + 1, cmp1);
    for(int i = 1; i <= n; i++)
        if(i != 1 && f[i].x == f[i - 1].x &&f[i].y == f[i - 1].y && f[i].z == f[i - 1].z) f[tot].cnt++;
        else f[++tot] = f[i], f[tot].cnt = 1;
    cdq(1,tot);
    sort(f + 1, f + tot + 1, cmp1);
    for(int i = 1; i <= tot; i++) num[f[i].ans] += f[i].cnt;
    for(int i = 1; i <= n; i++) cout << num[i] << "\n";
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/luoyibujue/p/9245550.html