莫名其妙 RE 求助
查看原帖
莫名其妙 RE 求助
456787
lightningZ楼主2022/10/7 14:01

RT,现在样例过了,并且不是数组的问题(开到 1e6 也会 RE)。

const int MAXN=100005;

int n,m,k;

int fa[MAXN<<1],d[MAXN<<1];
int find(int k){return (fa[k]==k?k:find(fa[k]));}

struct Edge{int u,v,ud,vd,id;};
stack<Edge> s;

inline bool Merge(int x,int y,int id){
	if(d[x]>d[y]) qswap(x,y);
	s.push((Edge){x,y,d[x],d[y],id});
	fa[x]=y; d[y]+=(d[x]==d[y]);
}

vector<pair<int,int> > tr[MAXN<<2];
void upd(int p,int l,int r,int st,int en,int x,int y){
	if(l>en || r<st) return;
	if(st<=l && r<=en){
		tr[p].push_back(make_pair(x,y));
		return;
	}
	int mid=(l+r)>>1;
	upd(p<<1,l,mid,st,en,x,y);
	upd(p<<1|1,mid+1,r,st,en,x,y);
}

void solve(int p,int l,int r){
	bool f=1;
	for(pair<int,int> t:tr[p]){
		int u=t.first,v=t.second;
		if(find(u)==find(v) || find(u+n)==find(v+n)){
			for(int i=l;i<=r;i++) pc('N'),pc('o'),pc(10);
			f=0; break;
		}
		Merge(find(u),find(v+n),p);
		Merge(find(u+n),find(v),p);
	}
	
	if(!f) return;
	if(l==r){
		pc('Y'),pc('e'),pc('s'),pc(10);
		return;
	}
	int mid=(l+r)>>1;
	solve(p<<1,l,mid);
	solve(p<<1|1,mid+1,r);
	
	while(!s.empty() && s.top().id==p){
		Edge x=s.top(); s.pop();
		fa[x.u]=x.u; d[x.v]=x.vd;
	}
}

int main(){
	read(n,m,k);
	for(int i=1;i<=(n<<1);i++) fa[i]=i,d[i]=1;
	for(int i=1;i<=m;i++){
		int x,y,l,r; read(x,y,l,r);
		upd(1,1,k,l+1,r,x,y);
	}
	solve(1,1,k);
	return flush(),0;
}
2022/10/7 14:01
加载中...