蒟蒻求助一道题目
  • 板块题目总版
  • 楼主zhaoxibo
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/8/24 11:45
  • 上次更新2023/11/3 01:34:07
查看原帖
蒟蒻求助一道题目
592662
zhaoxibo楼主2023/8/24 11:45

题目

只对了第1个点,跪求大佬

#include<cstdio>
#include<algorithm>
using namespace std;
int n,k;
struct sd{
	int a;
	int b;
	int c;
	int cnt;
}d[100005],e[100005];
bool cmp_a(sd A,sd 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 cmp_b(sd A,sd B){
	if(A.b!=B.b) return A.b<B.b;
	return A.c<B.c;
}
int num[100005],ans[100005];
int lowbit(int x){return x&(-x);}
int f[200005];
void add(int x,int y){
	for(;x<=k;x+=lowbit(x)) f[x]+=y;
}
int findth(int x){
	int sum=0;
	for(;x;x-=lowbit(x)) sum+=f[x];
	return sum;
}
void CDQ(int s,int t){
	if(s==t) return ;
	if(t-s==1){
		if(d[t].b>=d[s].b&&d[t].c>=d[s].c) num[t]+=d[s].cnt;
		return ;
	}
	int mid=(s+t)>>1;
	CDQ(s,mid);
	CDQ(mid+1,t);
	sort(d+s,d+mid+1,cmp_b);
	sort(d+mid+1,d+t+1,cmp_b);
	int i=s,j=mid+1;
	while(j<=t){
		while(d[i].b<=d[j].b&&i<=mid) add(d[i].c,d[i].cnt),i++;
		num[j]+=findth(d[j].c);
		j++;
	}
	i--;
	for(;i>=s;i--) add(d[i].c,-d[i].cnt);
}
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++) scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].c);
	sort(e+1,e+n+1,cmp_a);
	int tot=0,cnt_tot=0;
	for(int i=1;i<=n;i++){
		cnt_tot++;
		if(e[i].a!=e[i+1].a||e[i].b!=e[i+1].b||e[i].c!=e[i+1].c){
			tot++;
			d[tot].a=e[i].a;
			d[tot].b=e[i].b;
			d[tot].c=e[i].c;
			d[tot].cnt=cnt_tot;
			cnt_tot=0;
		}
	}
	int N=n;
	n=tot;
	CDQ(1,n);
	for(int i=1;i<=n;i++) num[i]=num[i]+d[i].cnt-1;
	for(int i=1;i<=n;i++) for(int j=1;j<=d[i].cnt;j++) ans[num[i]]++;
	for(int i=0;i<N;i++) printf("%d\n",ans[i]);
}
2023/8/24 11:45
加载中...