码迷,mamicode.com
首页 > 其他好文 > 详细

陌上花开

时间:2018-06-29 22:28:13      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:out   bool   tchar   odi   code   string   else   space   getch   

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;
}

 

陌上花开

标签:out   bool   tchar   odi   code   string   else   space   getch   

原文地址:https://www.cnblogs.com/luoyibujue/p/9245550.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!