关于玄学的AC
查看原帖
关于玄学的AC
483317
ATZdhjeb楼主2022/10/17 14:00

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

2022/10/17 14:00
加载中...