萌新求助CDQ分治全RE
查看原帖
萌新求助CDQ分治全RE
378951
farfarqwq楼主2022/7/12 10:37

RT

#include<bits/stdc++.h>
using namespace std;
struct p {
	int a, b, c, cnt, ans = 0;
	bool operator != (const p &B) const {
		return a != B.a || b != B.b || c != B.c;
	}
} s1[200005], s2[200005];
bool cmpa(p a, p b) {
	if (a.a != b.a)
		return a.a < b.a;
	if (a.b != b.b)
		return a.b < b.b;
	return a.c < b.c;
}
bool cmpb(p a, p b) {
	if (a.b != b.b)
		return a.b < b.b;
	return a.c < b.c;
}
int k, c[200005];
int lb(int x) {
	return x & (-x);
}
void add(int x, int v) {
	for (; x <= k; x += lb(x))
		c[x] += v;
}
int query(int x) {
	int ans = 0;
	for (; x; x -= lb(x))
		ans += c[x];
	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(s2 + l, s2 + mid + 1, cmpb);
	sort(s2 + mid + 1, s2 + r + 1, cmpb);
	int j = l;
	for (int i = mid + 1; i <= r; i++) {
		while (j <= mid && s2[j].b <= s2[i].b) {
			add(s2[j].c, s2[j].cnt);
			++j;
		}
		s2[i].ans += query(s2[i].c);
	}
	for (int i = l; i < j; i++)
		add(s2[i].c, -s2[i].cnt);
//	sort(s2 + mid + 1, s2 + r + 1, cmpa);
}
int cnt[200005];
int main() {
	int n, n1 = 0;
	scanf("%d%d", &n1, &k);
	for (int i = 1; i <= n1; i++) {
		scanf("%d%d%d", &s1[i].a, &s1[i].b, &s1[i].c);
		s1[i].ans = s1[i].cnt = 0;
	}
	sort(s1 + 1, s1 + n1 + 1, cmpa);
	for (int i = 1; i <= n1; i++) {
		if (i == 1 || s1[i] != s2[n]) {
			s2[++n] = s1[i];
			s2[n].cnt = 1;
		} else {
			++s2[n].cnt;
		}
	}
	cdq(1, n);
	for (int i = 1; i <= n; i++) {
		cnt[s2[i].ans + s2[i].cnt - 1] += s2[i].cnt;
	//	cout << "!!! " << i << ' ' << s2[i].ans << ' ' << s2[i].cnt << '\n';
	}
	for (int i = 0; i < n1; i++)
		printf("%d\n", cnt[i]);
	return 0;
}
2022/7/12 10:37
加载中...