CDQ 分治

CDQ 分治

还没写。。。

#include <bits/stdc++.h>
#define il inline

using namespace std;

bool Beg;
namespace Zctf1088 {
namespace IO {
	const int bufsz = 1 << 20;
	char ibuf[bufsz], *p1 = ibuf, *p2 = ibuf;
	#define getchar() (p1 == p2 && (p2 = (p1 = ibuf) + fread(ibuf, 1, bufsz, stdin), p1 == p2) ? EOF : *p1++)
	il int read() {
		int x = 0; char ch = getchar(); bool t = 0;
		while (ch < '0' || ch > '9') {t ^= ch == '-'; ch = getchar();}
		while (ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar();}
		return t ? -x : x;
	}
	char obuf[bufsz], *p3 = obuf, stk[50];
	#define flush() (fwrite(obuf, 1, p3 - obuf, stdout), p3 = obuf)
	#define putchar(ch) (p3 == obuf + bufsz && flush(), *p3++ = (ch))
	il void write(int x, bool t = 0) {
		int top = 0;
		x < 0 ? putchar('-'), x = -x : 0;
		do {stk[++top] = x % 10 | 48; x /= 10;} while(x);
		while (top) putchar(stk[top--]);
		t ? putchar(' ') : putchar('\n');
	}
	il void wrt() {putchar('\n');}
	struct FL {
		~FL() {flush();}
	} fl;
}
using IO::read; using IO::write; using IO::wrt;
const int N = 2e5 + 10;
int n, kk;
struct node {
	int x, y, z, cnt, num;
	il bool operator < (const node & c) const {
		return x != c.x ? x < c.x : (y != c.y ? y < c.y : z < c.z);
	}
} a[N], b[N];
namespace BIT {
	int c[N];
	il void update(int x, int v) {
		for (int i = x; i <= kk; i += (i & -i)) {
			c[i] += v;
		}
	}
	il int query(int x) {
		int res = 0;
		for (int i = x; i; i -= (i & -i)) {
			res += c[i];
		}
		return res;
	}
}
il void cdq(int l, int r) {
	if (l == r) return;
	int mid = (l + r) >> 1;
	cdq(l, mid), cdq(mid + 1, r);
	int pl = l, pr = mid + 1;
	for (int i = l; i <= r; i++) {
		if (pr > r || (pl <= mid && a[pl].y <= a[pr].y)) {
			BIT::update(a[pl].z, a[pl].cnt);
			b[i] = a[pl++];
		} else {
			a[pr].num += BIT::query(a[pr].z);
			b[i] = a[pr++];
		}
	}
	for (int i = l; i <= mid; i++) BIT::update(a[i].z, -a[i].cnt);
	for (int i = l; i <= r; i++) a[i] = b[i];
}
int t[N];
signed main() {
	n = read(), kk = read();
	for (int i = 1; i <= n; i++) {
		int x = read(), y = read(), z = read();
		a[i] = {x, y, z};
	}
	sort(a + 1, a + 1 + n);
	int m = 0;
	for (int i = 1, j = 0; i <= n; i++) {
		if (a[i].x == a[j].x && a[i].y == a[j].y && a[i].z == a[j].z) {
			a[j].cnt++;
		} else {
			a[++j] = a[i];
			a[j].cnt = 1;
			m++;
		}
	}
	cdq(1, m);
	for (int i = 1; i <= m; i++) {
		t[a[i].num + a[i].cnt - 1] += a[i].cnt;
	}
	for (int i = 0; i < n; i++) write(t[i]);
	
	return 0;
}}
bool End;
il void Usd() {cerr << "\nUse: " << (&Beg - &End) / 1024.0 / 1024.0 << "MB " << (double)clock() * 1000.0 / CLOCKS_PER_SEC << "ms\n";}
signed main() {
	Zctf1088::main();
	Usd();
	return 0;
}
posted @ 2025-12-10 20:05  Zctf1088  阅读(4)  评论(0)    收藏  举报