标签: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