社区讨论
莫名其妙 RE 求助
P5787【模板】线段树分治 / 二分图参与者 1已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo7v9io7
- 此快照首次捕获于
- 2023/10/27 08:19 2 年前
- 此快照最后确认于
- 2023/10/27 08:19 2 年前
RT,现在样例过了,并且不是数组的问题(开到 1e6 也会 RE)。
CPPconst 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 条回复,欢迎继续交流。
正在加载回复...