MnZn刚学CDQ一分钟,求救!!!
查看原帖
MnZn刚学CDQ一分钟,求救!!!
93701
Morgen_Kornblume楼主2021/6/11 13:23

63 pts.

WA on #2 #4 #10 #11

恳请大佬进来捉虫!!!

代码如下,可读性较好。

#include<cctype>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#define rit register int
#define ric register char
using namespace std;

const int maxz=600010;

inline int maxt(rit x,rit y){
	return (x>y)?(x):(y);
}

inline int mint(rit x,rit y){
	return (x<y)?(x):(y);
}

int n,m;
int ans[maxz],tot=0,lx=0,ly=0;

struct operate{
	int x,y,to;bool type;//true->add point / false->query
	
	bool operator < (operate tp){
		if(this->x==tp.x){
			if(this->y==tp.y)return (this->type&&(!tp.type));
			return this->y<tp.y;
		}
		return this->x<tp.x;
	}
}op[maxz],use[maxz],help[maxz];

struct binary_index_tree{
	
	int bas[1000010];
	
	int posq[maxz],top;
	
	inline void init(){
		memset(bas,0,sizeof(bas));
		top=0;
	}
	
	inline int getmax(int r){
		int res=0;
		for(rit pos=r;pos;pos^=(pos&(-pos)) ){
			res=maxt(bas[pos],res);
		}
		return res;
	}
	
	inline void insert(int pos,int val){
		posq[++top]=pos;
		for(;pos<=1000000;pos+=(pos&(-pos)) ){
			bas[pos]=maxt(bas[pos],val);
		}
		
	}
	
	inline void erase(){
		while(top){
			for(rit pos=posq[top];pos<=1000000;pos+=(pos&(-pos)) ){
				if(!bas[pos])break;
				else bas[pos]=0;
			}
			top--;
		}
	}
}bit;

inline int in(){
    rit val=0,sig=1;ric c=getchar();
    while(!isdigit(c)){if(c=='-')sig=-1;c=getchar();}
    while( isdigit(c))val=((val<<3)+(val<<1)+(c^48)),c=getchar();
    return val*sig;
}

inline void cdq(int l,int r){
	
	if(l==r)return;
	
	int mid=(l+r)>>1;
	
	cdq(l,mid);cdq(mid+1,r);
	
	rit lh=l;rit rh=mid+1;
	for(rit i=l;i<=r;++i){
		if(lh<=mid&&rh<=r){
			if(use[lh]<use[rh]){
				help[i]=use[lh];
				if(use[lh].type){
					bit.insert(use[lh].y,use[lh].x+use[lh].y);
				}++lh;
			}
			else{
				help[i]=use[rh];
				if(!use[rh].type){
					ans[use[rh].to]=mint(ans[use[rh].to],use[rh].x+use[rh].y-bit.getmax(use[rh].y));
				}++rh;
			}
		}
		else if(lh>mid){
			help[i]=use[rh];
			if(!use[rh].type){
				ans[use[rh].to]=mint(ans[use[rh].to],use[rh].x+use[rh].y-bit.getmax(use[rh].y));
			}++rh;
		}
		else{
			help[i]=use[lh];
			if(use[lh].type){
				bit.insert(use[lh].y,use[lh].x+use[lh].y);
			}++lh;
		}
	}
	for(rit i=l;i<=r;++i){
		use[i]=help[i];
	}
	
	bit.erase();
}

int main(){
	//freopen("P4169_2.in","r",stdin);
	//freopen("P4169_2.ans","w",stdout);
	bit.init();
	
	n=in();m=in();
	
	for(rit i=1;i<=n;++i){
		op[i].x=in()+1;op[i].y=in()+1;op[i].type=true;
		lx=maxt(lx,op[i].x);ly=maxt(ly,op[i].y);
		use[i]=op[i];
	}
	rit pos;
	for(rit i=1;i<=m;++i){
		pos=n+i;
		op[pos].type=(in()&1);op[pos].x=in()+1;op[pos].y=in()+1;
		if(!op[pos].type)op[pos].to=++tot;
		lx=maxt(lx,op[pos].x);ly=maxt(ly,op[pos].y);
		use[pos]=op[pos];
	}
	
	memset(ans,0x3f,sizeof(ans));++lx,++ly;
	
	cdq(1,n+m);
	
	for(rit i=1;i<=n+m;++i){
		use[i]=op[i];use[i].x=lx-use[i].x;
	}cdq(1,n+m);
	
	for(rit i=1;i<=n+m;++i){
		use[i]=op[i];use[i].y=ly-use[i].y;
	}cdq(1,n+m);
	
	for(rit i=1;i<=n+m;++i){
		use[i]=op[i];use[i].x=lx-use[i].x;use[i].y=ly-use[i].y;
	}cdq(1,n+m);
	
	for(rit i=1;i<=tot;++i){
		printf("%d\n",ans[i]);
	}
	
	return 0;
}
2021/6/11 13:23
加载中...