RE求调
  • 板块学术版
  • 楼主Zq_water
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/14 13:29
  • 上次更新2024/5/14 13:30:53
查看原帖
RE求调
895435
Zq_water楼主2024/5/14 13:29

P3810三维偏序,本地测数据全对,交上去全部RE

#include<bits/stdc++.h>
#define INF 1e16
#define endl '\n'
#define pb push_back
#define int long long
#define mem(x,v) memset(x,v,sizeof x)
using namespace std;
const int maxn = 2e5+5;
inline int read(){
	register int x=0,f=1;register char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}

int N,n,k,cnt,ans[maxn];
struct Array{int x,y,z,w,ans;}a[maxn],b[maxn];
struct Tree{
	int tr[maxn],N;
	int lowbit(int x){return x&(-x);}
	int add(int x,int k){for(;x<=N;x+=lowbit(x))tr[x]+=k;}
	int query(int x){int ans=0;for(;x;x-=lowbit(x))ans+=tr[x];return ans;}
}T;

bool cmp1(Array x,Array y){
	if(x.x==y.x){
		if(x.y==y.y)return x.z<y.z;
		return x.y<y.y;
	}
	return x.x<y.x;
}
bool cmp2(Array x,Array y){
	if(x.y==y.y)return x.z<y.z;
	return x.y<y.y;
}

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+mid+1,cmp2),sort(a+mid+1,a+r+1,cmp2);
	int i=l,j=mid+1;
	while(j<=r){
		while(a[i].y<=a[j].y&&i<=mid)T.add(a[i].z,a[i].w),i++;
		a[j].ans+=T.query(a[j].z),j++;
	}
	for(int k=l;k<i;k++)T.add(a[k].z,-a[k].w);
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>N>>k,T.N=N;
	for(int i=1;i<=N;i++)cin>>b[i].x>>b[i].y>>b[i].z;
	sort(b+1,b+N+1,cmp1);
	for(int i=1;i<=N;i++){
		cnt++;
		if(b[i].x==b[i+1].x&&b[i].y==b[i+1].y&&b[i].z==b[i+1].z)continue;
		n++,a[n]=b[i],a[n].w=cnt,cnt=0;
	}
	CDQ(1,n);
	for(int i=1;i<=n;i++)ans[a[i].ans+a[i].w-1]+=a[i].w;
	for(int i=0;i<N;i++)cout<<ans[i]<<endl;
	return 0;
}
2024/5/14 13:29
加载中...