2019牛客暑期多校训练营(第八场)D-Distance(三维BIT | 时间分治)

题意:

思路:

  • 将曼哈顿距离去绝对值的8种情况分别用BIT维护。暴力讨论比较最小值。
  • BIT维护把每个点拆掉绝对值后的8种贡献。
#include
using namespace std;
typedef long long ll;
const int maxn = 3e5+5;
const double eps = 1e-10;
const int inf = 1<<30;
int n,m,h,q;
void gmax(int& a,int b){
	if(ab) a=b;
}
struct BIT{
	int c[maxn];
	inline int lowbit(int x){return x&(-x);}
	inline int gid(int x,int y,int z){
		return x*m*h+y*h+z;
	}
	void clear(){
		for(int i=0;i0;i-=lowbit(i)){
			for(int j=y;j>0;j-=lowbit(j)){
				for(int k=z;k>0;k-=lowbit(k)){
					gmax(res,c[gid(i,j,k)]);
				}
			}
		}
		return res;
	}
}bit[8];
int main() {
	for(int i=0;i<8;i++) bit[i].clear();
	scanf("%d%d%d%d",&n,&m,&h,&q);
	int op,x,y,z,cnt=0;
	while(q--){
		scanf("%d%d%d%d",&op,&x,&y,&z);
		if(op == 1){
			for(int i=0;i<8;i++){
				int v = (i&1?-x:x) + ((i>>1)&1?-y:y) + ((i>>2)&1?-z:z);
				bit[i].update(i&1?n+1-x:x,(i>>1)&1?m+1-y:y,(i>>2)&1?h+1-z:z,v);				
			}
		}
		else{
			int ans = inf;
			for(int i=0;i<8;i++){
				int v = (i&1?-x:x) + ((i>>1)&1?-y:y) + ((i>>2)&1?-z:z);
				gmin(ans,v-bit[i].query(i&1?n+1-x:x,(i>>1)&1?m+1-y:y,(i>>2)&1?h+1-z:z));
			}
			printf("%d\n",ans);
		}
	}
	return 0;
}

 

你可能感兴趣的:(树状数组)