求调
查看原帖
求调
350558
_wsq_楼主2025/6/26 18:28

讨论区里的警示后人都看了(可能看漏),没找到问题。

#include <iostream>
#include <vector>
#include <cassert>
#include <algorithm>
#include <stack>
#include <utility>
using namespace std;
#define maxn 200005
#define ls (rt<<1)
#define rs ((rt<<1)|1)
#define mid ((l+r)>>1)
int n,m,k,sx[maxn],sy[maxn],fa[maxn<<1],dep[maxn<<1];
bool ans=true;
vector<int> seg[maxn<<2];
stack<pair<int,int> > s;
int get(int x){
	if(fa[x]==x){
		return x;
	}
	return get(fa[x]);
}
void merge(int x,int y){
	x=get(x);
	y=get(y);
	if(dep[x]>dep[y]){
		swap(x,y);
	}
	fa[x]=y;
	s.push(make_pair(x,dep[y]));
	dep[y]=max(dep[y],dep[x]+1);
}
void undo(void){
	dep[fa[s.top().first]]=s.top().second;
	fa[s.top().first]=s.top().first;
	s.pop();
	return;
}
void add(int x,int y,int id,int l,int r,int rt){
	if(x<=l&&r<=y){
		seg[rt].push_back(id);
		return;
	}
	if(mid>=x){
		add(x,y,id,l,mid,ls);
	}
	if(mid<y){
		add(x,y,id,mid+1,r,rs);
	}
	return;
}
void dfs(int l,int r,int rt){
	bool cnt=false;
	for(int i=0;i<seg[rt].size();i++){
		merge((sx[seg[rt][i]]<<1)-1,sy[seg[rt][i]]<<1);
		merge(sx[seg[rt][i]]<<1,(sy[seg[rt][i]]<<1)-1);
		if(ans&&get((sx[seg[rt][i]]<<1)-1)==get(sx[seg[rt][i]]<<1)){
			cnt=true;
			ans=false;
		}
	}
	if(l==r){
		if(ans){
			cout<<"Yes\n";
		}
		else{
			cout<<"No\n";
		}
	}
	else{
		dfs(l,mid,ls);
		dfs(mid+1,r,rs);
	}
	for(int i=0;i<(seg[rt].size()<<1);i++){
		undo();
	}
	if(cnt){
		ans=true;
	}
	return;
}
int main(){
	cin>>n>>m>>k;
	for(int i=1;i<=(1<<n);i++){
		fa[i]=i;
		dep[i]=1;
	}
	for(int i=1;i<=m;i++){
		int l,r;
		cin>>sx[i]>>sy[i]>>l>>r;
		if(l<r){
			add(l+1,r,i,1,k,1);
		}
	}
	dfs(1,k,1);
	return 0;
}
2025/6/26 18:28
加载中...