求助二维树状数组带哈希解三维偏序
查看原帖
求助二维树状数组带哈希解三维偏序
768195
ty_mxzhn楼主2023/3/31 21:33

rt,TLE90,怎么卡都卡不过。

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

inline void read(int &x){
	x=0;
	short flag=1;
	char c=getchar();
   while(c<'0'||c>'9'){
       if(c=='-')flag=-1;
       c=getchar();
   }
	while(c>='0'&&c<='9'){
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	x*=flag;
}
struct nd{int i,j,aij;};//h_i_j=aij;
struct ele{int x,y,z;}a[100007];
vector<nd> hs[100007];
int n,k,b[100007],c[100007],d[100007];
inline int has(int x,int y){ return (x%100007+y*20%100007*100%100007*100%100007)%100007; }
void hsadd(int x,int y,int z){
	int h=has(x,y);
	for(register int i=0;i<hs[h].size();i++)
		if(hs[h][i].i==x&&hs[h][i].j==y){
			hs[h][i].aij+=z;
			return;
		}
	hs[h].push_back((nd){x,y,z});
}
int hsquery(int x,int y){
	int h=has(x,y);
	for(register int i=0;i<hs[h].size();i++)
		if(hs[h][i].i==x&&hs[h][i].j==y)
			return hs[h][i].aij;
	return 0;
}
inline int lowbit(int x){ return x&(-x); }
void add(int x,int y,int z){
	for(register int xx=x;xx<=k+1;xx+=lowbit(xx))
		for(register int yy=y;yy<=k+1;yy+=lowbit(yy))
			hsadd(xx,yy,z);
}
int query(int x,int y){
	int ans=0;
	for(register int xx=x;xx>=1;xx-=lowbit(xx))
		for(register int yy=y;yy>=1;yy-=lowbit(yy))
			ans+=hsquery(xx,yy);
	return ans;
}
inline bool cmp(ele a,ele b){
	if(a.x!=b.x) return a.x<b.x;
	if(a.y!=b.y) return a.y<b.y;
	return a.z<b.z;
}
signed main(){
	//freopen("P3810_10.in","r",stdin);
	read(n),read(k);
	for(int i=1;i<=n;i++){
		read(a[i].x),read(a[i].y),read(a[i].z);
		//a[i].id=i;
	}
	sort(a+1,a+n+1,cmp);
	//for(int i=1;i<=n;i++) printf("%lld %lld %lld\n",a[i].x,a[i].y,a[i].z);
	for(register int i=1;i<=n;i++){
		b[i]=b[i]+query(a[i].y,a[i].z);
		add(a[i].y,a[i].z,1);
	}
	c[n+1]=-1;
	for(int i=n;i>=1;i--){
		c[i]=(a[i].x==a[i+1].x&&a[i].y==a[i+1].y&&a[i].z==a[i+1].z)?(c[i+1]+1):(0);
	}
	for(int i=1;i<=n;i++){
		d[b[i]+c[i]]++;
	}
	for(int i=0;i<n;i++){
		printf("%d\n",d[i]);
	}
	return 0;
}

2023/3/31 21:33
加载中...