1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| namespace Solve3{ struct yyy{ int x,y,z,w; }a[maxn]; ll ans; #define lowbit(x) ((x)&(-x)) int f[250][250][250]; inline void add(int x,int y,int z,int w) { int i,j,k; for (i=x;i<=m;i+=lowbit(i)) for (j=y;j<=m;j+=lowbit(j)) for (k=z;k<=m;k+=lowbit(k)) f[i][j][k]+=w; } inline int query(int x,int y,int z) { int i,j,k,sum=0; for (i=x;i;i-=lowbit(i)) for (j=y;j;j-=lowbit(j)) for (k=z;k;k-=lowbit(k)) sum+=f[i][j][k]; return sum; } inline bool cmp(yyy x,yyy y){return x.w<y.w;} inline void main(){ int i,j,k,l,x,y,z; for (i=1;i<=n;i++) { read(x);read(y);read(z); a[i].w=x+y+z+m; a[i].x=x+y-z+m; a[i].y=x-y+z+m; a[i].z=y+z-x+m; } m*=3; sort(a+1,a+1+n,cmp); int now=0; for (i=1;i<=n;i++) { while (now<n&&a[now+1].w+d<a[i].w) now++,add(a[now].x,a[now].y,a[now].z,-1); int rx=min(m,a[i].x+d),ry=min(m,a[i].y+d),rz=min(m,a[i].z+d); int lx=max(0,a[i].x-d-1),ly=max(0,a[i].y-d-1),lz=max(0,a[i].z-d-1); ans+=query(rx,ry,rz) -query(lx,ry,rz)-query(rx,ly,rz)-query(rx,ry,lz) +query(lx,ly,rz)+query(lx,ry,lz)+query(rx,ly,lz) -query(lx,ly,lz); add(a[i].x,a[i].y,a[i].z,1); } printf("%lld",ans); } }
|