Wa on #5 #8
查看原帖
Wa on #5 #8
1555555
Rainned楼主2024/11/13 21:51
#include<bits/stdc++.h>
using namespace std;
int n,m,k,fa[200005],h[200005],top,ans[100005];
struct Node{
  int L,R,x,y;
}e[200005];
struct node{
  int x,y,h;
}s[200005];
vector<int> tree[800005];
int find(int x){
  if(x==fa[x]) return x;
  return fa[x];
}
void gt(int x,int y){
  x=find(x),y=find(y);
  if(h[x]<h[y]) swap(x,y);
  s[++top]={x,y,h[x]==h[y]};
  fa[y]=x;
  h[x]+=(h[x]==h[y]);
}
void add(int x,int l,int r,int X,int Y,int i){
  if(X<=l&&Y>=r){
    tree[x].push_back(i);
    return;
  }
  int mid=(l+r)>>1;
  if(X<=mid){
    add(x<<1,l,mid,X,Y,i);
  }
  if(Y>mid){
    add(x<<1|1,mid+1,r,X,Y,i);
  }
}
void egg(int t,int l,int r){
  int cnt=0,flag=0;
  for(int i=0;i<tree[t].size();i++){//加边
    int x=e[tree[t][i]].L,y=e[tree[t][i]].R;
    if(find(x)==find(y)){
      flag=1;
      for(int j=l;j<=r;j++){
        ans[j]=1;
      }
      break;
    }
    if(find(x)!=find(y+n)){
      cnt++;
      gt(x,y+n);
    }
    if(find(y)!=find(x+n)){
      cnt++;
      gt(y,x+n);
    }
  }
  if(l<r&&flag==0){
    int mid=(l+r)>>1;
    egg(t<<1,l,mid);
    egg(t<<1|1,mid+1,r);
  }
  while(cnt--){//删除
    h[s[top].x]-=s[top].h;
    fa[s[top].y]=s[top].y;
    top--;
  }
}
int main(){
  cin>>n>>m>>k;
  for(int i=1;i<=m;i++){
    int x,y,l,r;
    cin>>x>>y>>l>>r;
    e[i]={x,y,l+1,r};
    if(l+1<=r){
      add(1,1,k,l+1,r,i);//把边加入线段树
    }
  }
  for(int i=1;i<=n+n;i++) fa[i]=i,h[i]=1;
  egg(1,1,k);//dfs
  for(int i=1;i<=k;i++){
    cout<<(ans[i]==1?"No\n":"Yes\n");
  }
  return 0;
}
2024/11/13 21:51
加载中...