刚学CDQ,求助 AC#1 求助
查看原帖
刚学CDQ,求助 AC#1 求助
1351126
General0826楼主2024/11/22 19:25
#include <bits/stdc++.h>
#define ll long long 
using namespace std;
const int N=2e5+5;
int cnt[N],n,k,ans[N],len;
struct node{
	int a,b,c,id,w;
}c[N];
bool cmpa(node a,node b){
	if(a.a==b.a){
		if(a.b==b.b){
			return a.c<b.c;
		}
		return a.b<b.b;
	}
	return a.a<b.a;
}
bool cmpb(node a,node b){
	if(a.c==b.c){
		return a.c<b.c;
	}
	return a.b<b.b;
}
namespace LowbitTree{
	int t[N];
	int lowbit(int x){
		return  x&(-x);
	}
	void add(int x,int w){
		for(;x<=k;x+=lowbit(x))
			t[x]+=w;
	}
	int res(int x){
		int num=0;
		for(;x;x-=lowbit(x)) num+=t[x];
		return num;
	}
	void clear(){
		for(int i=0;i<N;i++)
			t[i]=0;
	}
}
using namespace LowbitTree;
void CDQ(int L,int R){
	if(L==R) return ;
	int mid=(L+R)>>1,lt=L;
	CDQ(L,mid);
	CDQ(mid+1,R);
	sort(c+L,c+mid+1,cmpb);
	sort(c+mid+1,c+R+1,cmpb);
	for(int i=mid+1;i<=R;i++){
		while(lt<=mid&&c[lt].b<=c[i].b){
			add(c[lt].c,c[lt].w);
			lt++;
		}
		ans[c[i].id]+=res(c[i].c);
	}
	clear();
}
void  outtong(){
	int num=0;
	for(int i=1;i<=n;i++){
		num++;
        if(c[i].a!=c[#include <bits/stdc++.h>
#define ll long long 
using namespace std;
const int N=2e5+5;
int cnt[N],n,k,ans[N],len;
struct node{
	int a,b,c,id,w;
}c[N];
bool cmpa(node a,node b){
	if(a.a==b.a){
		if(a.b==b.b){
			return a.c<b.c;
		}
		return a.b<b.b;
	}
	return a.a<b.a;
}
bool cmpb(node a,node b){
	if(a.c==b.c){
		return a.c<b.c;
	}
	return a.b<b.b;
}
namespace LowbitTree{
	int t[N];
	int lowbit(int x){
		return  x&(-x);
	}
	void add(int x,int w){
		for(;x<=k;x+=lowbit(x))
			t[x]+=w;
	}
	int res(int x){
		int num=0;
		for(;x;x-=lowbit(x)) num+=t[x];
		return num;
	}
	void clear(){
		for(int i=0;i<N;i++)
			t[i]=0;
	}
}
using namespace LowbitTree;
void CDQ(int L,int R){
	if(L==R) return ;
	int mid=(L+R)>>1,lt=L;
	CDQ(L,mid);
	CDQ(mid+1,R);
	sort(c+L,c+mid+1,cmpb);
	sort(c+mid+1,c+R+1,cmpb);
	for(int i=mid+1;i<=R;i++){
		while(lt<=mid&&c[lt].b<=c[i].b){
			add(c[lt].c,c[lt].w);
			lt++;
		}
		ans[c[i].id]+=res(c[i].c);
	}
	clear();
}
void  outtong(){
	int num=0;
	for(int i=1;i<=n;i++){
		num++;
        if(c[i].a!=c[i+1].a||c[i].b!=c[i+1].b||c[i].c!=c[i+1].c){
			len++;
			c[len]=c[i];
			c[len].id=len;
			c[len].w=num;
			num=0;
		}
	}
}	
void Cin(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)
		cin>>c[i].a>>c[i].b>>c[i].c;
}
void Cout(){
	for(int i=1;i<=len;i++)
		cnt[ans[i]+c[i].w-1]+=c[i].w;
	for(int i=0;i<n;i++)
		cout<<cnt[i]<<'\n';
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	Cin();
	sort(c+1,c+1+n,cmpa);
	outtong();
	CDQ(1,len);
	Cout();
	return 0;
}
i+1].a||c[i].b!=c[i+1].b||c[i].c!=c[i+1].c){
			len++;
			c[len]=c[i];
			c[len].id=len;
			c[len].w=num;
			num=0;
		}
	}
}	
void Cin(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)
		cin>>c[i].a>>c[i].b>>c[i].c;
}
void Cout(){
	for(int i=1;i<=len;i++)
		cnt[ans[i]+c[i].w-1]+=c[i].w;
	for(int i=0;i<n;i++)
		cout<<cnt[i]<<'\n';
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	Cin();
	sort(c+1,c+1+n,cmpa);
	outtong();
	CDQ(1,len);
	Cout();
	return 0;
}

2024/11/22 19:25
加载中...