CDQ分治

三维偏序模板题

#include <bits/stdc++.h>
using ll = long long;

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	
	int n,lim;
	std::cin >> n >> lim;
	
	std::vector<std::array<int,5>> a(n ,{0}),ar;
	for(int i = 0 ; i < n ; ++i) {
		std::cin >> a[i][0] >> a[i][1] >> a[i][2];
	}
	std::sort(a.begin(),a.end());
	
	
	for(int i = 0 ; i < n ; ++i) {
		int cnt = 1;
		while(i + 1 < n && a[i] == a[i + 1]) ++i,++cnt;
		a[i][3] = cnt;
		ar.push_back({a[i][0] , a[i][1] , a[i][2] , a[i][3] , 0}); 
	}
	
	std::vector<int> tr(lim + 1);
	
	auto lowbit = [&](int x) {
		return x & -x;	
	};
	auto add = [&](int x , int v) {
		while(x <= lim) {
			tr[x] += v;
			x += lowbit(x);
		}
	};
	auto query = [&](int x) {
		int sum = 0;
		while(x) {
			sum += tr[x];
			x -= lowbit(x);
		}
		return sum;	
	};
	
	int m = ar.size();
	
//	for(int i = 0 ; i < m ; ++i) {
//		std::cout << ar[i][0] << ' ' << ar[i][1] << ' ' << ar[i][2] << ' ' << ar[i][3] << '\n';
//	}
//	exit(0);
	
	std::function<void(int,int)> CDQ = [&](int l,int r) {
		
		if(l == r) return;
		int mid = l + r >> 1;
		CDQ(l , mid) , CDQ(mid + 1 , r);
		
		std::sort(ar.begin() + l , ar.begin() + mid + 1 , 
		[&](const std::array<int,5> &x , const std::array<int,5> &y){
			return x[1] < y[1];	
		});
		std::sort(ar.begin() + mid + 1 , ar.begin() + r + 1 , 
		[&](const std::array<int,5> &x , const std::array<int,5> &y){
			return x[1] < y[1];	
		});	
		
		int i = l , j = mid + 1;
		while(j <= r) {
			while(i <= mid && ar[j][1] >= ar[i][1]) {
				add(ar[i][2] , ar[i][3]);
				i++;
			}
			ar[j][4] += query(ar[j][2]);
			j++;
		}
		
		for(int k = l ; k < i ; ++k)
			add(ar[k][2] , -ar[k][3]);
		return;
	};
	
	CDQ(0 , m - 1);
	
	std::vector<int> f(n , 0);
	for(int i = 0 ; i < m ; ++i) {
//		std::cout << "*" << i << ' ' << ar[i][0] << ' ' << ar[i][1] << ' ' 
//		<< ar[i][2] << ' ' << ar[i][3] << ' ' << ar[i][4] << '\n';
		f[ar[i][3] + ar[i][4] - 1] += ar[i][3];
	}
//	
	for(int i = 0 ; i < n ; ++i) {
		std::cout << f[i] << '\n';
	}
	
	return 0;	
} 

posted @ 2023-07-10 10:11  xqy2003  阅读(23)  评论(0)    收藏  举报