MnZn求调
查看原帖
MnZn求调
556740
hzx360楼主2023/4/4 17:24

只有第一个点对了,但翻了翻题解感觉也没多少不一样的W_W。

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+100; 
int n,k,cnt,ans[N];
struct node{
	int a,b,c,num;
}bb[N],a[N];
bool cmp1(node A,node 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 cmp2(node A,node B){
	if(A.b!=B.b) return A.b<B.b;
	else return A.c<B.c;
}
int c[N];
int lowbit(int x){return x&(-x);}
void add(int x,int val){for(;x<=k;x+=lowbit(x))c[x]+=val;}
int sum(int x){int res=0;for(;x>0;x-=lowbit(x))res+=c[x];return res;}
void cdq(int l,int r){
	if(l==r) return;
	int mid=(l+r)>>1;
	cdq(l,mid),cdq(mid+1,r);
	sort(a+l,a+1+mid,cmp2);
	sort(a+mid+1,a+1+r,cmp2);
	int j=l;
	for(int i=mid+1;i<=r;i++){
		while(a[i].b>=a[j].b and j<=mid){
			add(a[j].c,a[j].num);
			j++;
		}
		ans[i]+=sum(a[i].c);
	}
	for(int i=l;i<j;i++) add(a[i].c,-a[i].num);
}
int number[N];
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++) scanf("%d%d%d",&bb[i].a,&bb[i].b,&bb[i].c),bb[i].num=1;
	sort(bb+1,bb+1+n,cmp1);
	for(int i=1;i<=n;i++){
		if(i==1 or bb[i-1].a!=bb[i].a or bb[i-1].b!=bb[i].b or bb[i-1].c!=bb[i].c) a[++cnt]=bb[i];
		else a[cnt].num++;
	}
	cdq(1,cnt);
	for(int i=1;i<=cnt;i++) number[ans[i]+a[i].num-1]+=a[i].num;
	for(int i=0;i<n;i++) cout<<number[i]<<endl;
}
2023/4/4 17:24
加载中...