RT,下面这份代码本机连样例都过不去,但提交AC???/yiw
#include <bits/stdc++.h>
using namespace std;
inline int input() {
register int x = 0,f = 1;
register char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') f = -1;
c = getchar();
}
while (c <= '9' && c >= '0') x = (x << 3) + (x << 1) + (c ^ 48),c = getchar();
return x * f;
}
struct Data {
int a;
int b;
int c;
int w;
int cnt;
Data() {}
Data(const int& u,const int& v,const int& z) {
a = u;
b = v;
c = z;
}
}x[100010],y[100010];
int n,k,tree[200020],m = 0,ans[100010];
inline int lowbit(const int& x) {
return x & (-x);
}
inline void add(const int& x,const int& v) {
for (register int i = x; i <= k; i += lowbit(i)) tree[i] += v;
}
inline int query(const int& x) {
int ans = 0;
for (register int i = x; i >= 1; i -= lowbit(i)) ans += tree[i];
return ans;
}
inline const bool comp_a(const Data& x,const Data& y) {
return x.a == y.a ? (x.b == y.b ? x.c < y.c : x.b < y.b) : x.a < y.a;
}
inline const bool comp_b(const Data& x,const Data& y) {
return x.b == y.b ? x.c < y.c : x.b < y.b;
}
void CDQ(const int& l,const int& r) {
if (l == r) return;
CDQ(l,(l + r) / 2);
CDQ((l + r) / 2 + 1,r);
int mid = (l + r) / 2;
sort(y + l,y + mid + 1,comp_b);
sort(y + mid + 1,y + r + 1,comp_b);
int ptr = l;
for (register int i = mid + 1; i <= r; ++i) {
while (y[ptr].b <= y[i].b && ptr <= mid) {
add(y[ptr].c,y[ptr].w);
++ptr;
}
y[i].cnt += query(y[i].c);
}
for (register int i = l; i < ptr; ++i) add(y[i].c,-y[i].w);
}
int main() {
n = input();
k = input();
for (register int i = 1; i <= n; ++i) {
int a = input(),b = input(),c = input();
x[i] = Data(a,b,c);
}
sort(x + 1,x + n + 1,comp_a);
for (register int i = 1,nw = 0; i <= n; ++i) {
++nw;
if (!(x[i].a == x[i + 1].a && x[i].b == x[i + 1].b && x[i].c == x[i + 1].c)) {
y[++m] = Data(x[i].a,x[i].b,x[i].c);
y[m].w = nw;
nw = 0;
}
}
CDQ(1,m);
for (register int i = 1; i <= m; ++i) ans[y[i].cnt + y[i].w - 1] += y[i].w;
for (register int i = 0; i < n; ++i) printf("%d\n",ans[i]);
return 0;
}
本地样例的输出是:
3
0
1
0
1
0
0
1
0
0