社区讨论

莫名其妙 RE 求助

P5787【模板】线段树分治 / 二分图参与者 1已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo7v9io7
此快照首次捕获于
2023/10/27 08:19
2 年前
此快照最后确认于
2023/10/27 08:19
2 年前
查看原帖
RT,现在样例过了,并且不是数组的问题(开到 1e6 也会 RE)。
CPP
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;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...