求助,代码求调
  • 板块灌水区
  • 楼主ClearluvXL
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/24 16:56
  • 上次更新2024/10/24 18:57:40
查看原帖
求助,代码求调
774188
ClearluvXL楼主2024/10/24 16:56

三维偏序求助

题目

你好陌生人,我需要帮助

现在我认为大概率是是 \leq 的问题。导致我没能将一些相等的情况算入答案。

#include<bits/stdc++.h>
#define endl '\n' 
#define lint __int128
using namespace std;

const int N=2e5+10;

struct node{
	int a,b,c,id;
}s[N]; 

int n,k;

int tr[N];

int lowbit(int x){
	return x&(-x);
}//end

void add(int x){
	for(int i=x;i<=k;i+=lowbit(i)) tr[i]++;
}//end

void clear(int x){
	for(int i=x;i<=k;i+=lowbit(i)) {
		if(tr[i]) tr[i]=0;
		else break;
	}
}//end

int query(int x){
	int ans=0;
	for(int i=x;i;i-=lowbit(i)) ans+=tr[i];
	return ans;
}//end

bool cmp1(node x,node y){
	if(x.a==y.a&&x.b==y.b) return x.c<y.c;
	if(x.a==y.a) return x.b<y.b;
	return x.a<y.a;
}//end

bool cmp2(node x,node y){
	if(x.b==y.b) return x.c<y.c;
	return x.b<y.b;
}//end

int f[N];
int ans[N];

node a[N],b[N];

void solve(int l,int r){
	if(l==r) return;
	int mid=l+r>>1;
	solve(l,mid); solve(mid+1,r);
	for(int i=l;i<=mid;i++) a[i]=s[i];
	for(int i=mid+1;i<=r;i++) b[i]=s[i];
	
	sort(a+l,a+mid+1,cmp2); 
	sort(b+mid+1,b+r+1,cmp2);
	
	int i=l-1;
	for(int j=mid+1;j<=r;j++){
		while(i<mid&&a[i+1].b<=b[j].b){
			i++;
			add(a[i].c);
		}
		f[b[j].id]+=query(b[j].c);
	}
	for(;i>=l;i--) clear(a[i].c);
}//end

int main(){
	freopen("1.in","r",stdin );
	
//	ios::sync_with_stdio(0);	
	
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		int a,b,c; cin>>a>>b>>c;
		s[i]={a,b,c,i};
	}	
	
	sort(s+1,s+n+1,cmp1);
	
	solve(1,n);
	
	for(int i=1;i<=n;i++) ans[f[i]]++;
	for(int i=0;i<n;i++) cout<<ans[i]<<endl;
	
	return 0;
}//end
2024/10/24 16:56
加载中...