CDQ WA 求助
查看原帖
CDQ WA 求助
688783
SilverLi楼主2023/6/8 17:57
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
const int N = 2e6 + 5;
int n, k, ans[N];
struct node {
	int a, b, c;
	int cnt, ans;
}b[N],a[N];
int cntx;
int t[N];
inline void add(int k, int v) { while (k <= n)	t[k] += v, k += k & -k; }
inline int sum(int k) { int ans = 0; while (k != 0) { ans += t[k], k -= k & -k; } return ans; }
void CDQ(int l, int r) {
	if (l == r) { return; }
	int mid = (l + r) >> 1;
	CDQ(l, mid);
	CDQ(mid + 1, r);
	sort(a + l, a + mid + 1, [](node x, node y) {
		if (x.b == y.b) { return x.c < y.c; }
		return x.b < y.b;
	});
	sort(a + mid + 1, a + r, [](node x, node y) {
		if (x.b == y.b) { return x.c < y.c; }
		return x.b < y.b;
	});
	int j, i = l;
	for (j = mid + 1; j <= r; ++j) {
		while (a[j].b > a[i].b && i <= mid) {
			add(a[j].c, a[j].cnt);
			++i;
		}
		if (i > mid) { break; }
		a[j].ans += sum(a[j].c);
	}
	for (int i = l; i <= r; ++i) { add(a[i].c, -a[i].cnt); }
}
signed main() {
	cin >> n >> k;
	for (int i = 1; i <= n; ++i) { cin >> b[i].a >> b[i].b >> b[i].c; }
	sort(b + 1, b + n + 1, [](node x, node y) {
		if (x.a == y.a) {
			if (x.b == y.b) { return x.c < y.c; }
			return x.b < y.b;
		}
		return x.a < y.a;
	});
	int l = 0;
	for (int i = 1; i <= n; ++i) {
		++l;
		if (b[i].a != b[i + 1].a ||
			b[i].b != b[i + 1].b ||
			b[i].c != b[i + 1].c) {
			a[++cntx].a = b[i].a;
			a[cntx].b = b[i].b;
			a[cntx].c = b[i].c;
			a[cntx].cnt = l;
			l = 0;
		}
	}
	CDQ(1, cntx);
	for (int i = 1; i <= cntx; ++i) { ans[a[i].ans + a[i].cnt - 1] += a[i].cnt; }
	for (int i = 0; i < n; ++i) { cout << ans[i] << '\n'; }
	return 0;
}
2023/6/8 17:57
加载中...