萌新刚学cdq分治样例过不去求调qwq
查看原帖
萌新刚学cdq分治样例过不去求调qwq
716260
SegmentTree_楼主2024/1/29 13:54

看着第一篇题解对了好久

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+5;
struct point{
	int x, y, z, ans, w;
	point(){
		x = y = z = ans = w = 0;
	}
}a[N], b[N];
int tr[N], ans[N];
int n_, n, k; 
int lowbit(int x){
	return x & (-x);
}
void add(int pos, int k){
	for (int i = pos;i <= k;i += lowbit(i)) tr[i] += k;
}
int sum(int pos){
	int res = 0;
	for (int i = pos;i;i -= lowbit(i)) res += tr[i];
	return res;
}
bool cmpx(point a, point b){
	if (a.x == b.x){
		if (a.y == b.y) return a.z < b.z;
		return a.y < b.y;
	}
	return a.x < b.x;
}
bool cmpy(point a, point b){
	if (a.y == b.y) return a.z < b.z;
	return a.y < b.y;
}
void cdq(int l, int r){
	if (l >= r) return;
	//cout << l << ' ' << r << '\n';
	int mid = (l + r) >> 1;
	cdq(l, mid), cdq(mid + 1, r);
	sort(a + l, a + mid + 1, cmpy);
	sort(a + mid + 1, a + r + 1, cmpy);
	int j = l, i = mid + 1;
	for (;i <= r;i++){
		while (a[j].y <= a[i].y && j <= mid){
			add(a[j].z, a[j].w), ++j;
		}
		a[i].ans += sum(a[i].z);
	}
	for (i = l;i < j;i++) add(a[i].z, -a[i].w);
}
int main(){ 
	cin >> n_ >> k;
	for (int i = 1;i <= n_;i++){
		cin >> b[i].x >> b[i].y >> b[i].z;
	}
	sort(b + 1, b + 1 + n_, cmpx);
	int cnt = 0;
	for (int i = 1;i <= n_;i++){
		++cnt;
		if (b[i].x != b[i + 1].x || b[i].y != b[i + 1].y || b[i].z != b[i + 1].z){
			a[++n].x = b[i].x;
			a[n].y = b[i].y;
			a[n].z = b[i].z;
			a[n].w = cnt;
			cnt = 0;
		}
	}
	cdq(1, n);
	for (int i = 1;i <= n;i++){
		ans[a[i].ans + a[i].w - 1] += a[i].w;
	}
	//cout << "-------------------------------------\n";
	//for (int i = 1;i <= n;i++){
	//	cout << a[i].x << ' ' << a[i].y << ' ' << a[i].z << ' ' << a[i].ans << ' ' << a[i].w << '\n';
	//}
	for (int i = 0;i < n_;i++) cout << ans[i] << '\n';
	return 0;
}
2024/1/29 13:54
加载中...