社区讨论
高二老年人求调模版
P5787【模板】线段树分治 / 二分图参与者 14已保存回复 20
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 20 条
- 当前快照
- 1 份
- 快照标识符
- @mhizshq1
- 此快照首次捕获于
- 2025/11/03 18:23 4 个月前
- 此快照最后确认于
- 2025/11/03 20:26 4 个月前
妈的
CPP#include<bits/stdc++.h>
#define int long long
#define INF 1e18
#define N 1000005
using namespace std;
struct node{
int x,y;
};
int n,m,k,fa[N],siz[N],ans[N];
vector<node>vt[N];
int Find(int x){
return x==fa[x]?x:Find(fa[x]);
}
void merge(int x,int y,vector<node>v){
if(siz[x]>siz[y]) swap(x,y);
fa[x]=y,siz[y]+=siz[x];
v.push_back(node{x,y});
}
void trace(vector<node>v){
for(node t:v) siz[t.y]-=siz[t.x],fa[t.x]=fa[t.x];
}
void add(int p,int l,int r,int L,int R,int x,int y){
if(L<=l&&r<=R){
vt[p].push_back(node{x,y});
return;
}
int mid=l+r>>1;
if(L<=mid) add(p<<1,l,mid,L,R,x,y);
if(R>mid) add(p<<1|1,mid+1,r,L,R,x,y);
}
void solve(int p,int l,int r){
int fl=1,mid=l+r>>1; vector<node>res;
for(node t:vt[p]){
int fx1=Find(t.x),fx2=Find(t.x+n),fy1=Find(t.y),fy2=Find(t.y+n);
if(fx1==fy1){ fl=0; break; }
merge(fx1,fy2,res),merge(fx2,fy1,res);
}
if(fl){
if(l==r) ans[l]=1;
else solve(p<<1,l,mid),solve(p<<1|1,mid+1,r);
}
trace(res);
}
signed main(){
ios::sync_with_stdio(false);
cin>>n>>m>>k;
for(int i=1,x,y,l,r;i<=m;i++){
cin>>x>>y>>l>>r,l++;
add(1,1,k,l,r,x,y);
}
for(int i=1;i<=n*2;i++) fa[i]=i,siz[i]=1;
solve(1,1,k);
for(int i=1;i<=k;i++) cout<<(ans[i]?"Yes\n":"No\n");
return 0;
}
回复
共 20 条回复,欢迎继续交流。
正在加载回复...