线段树分治板子,萌新80分求调
查看原帖
线段树分治板子,萌新80分求调
467418
ifxxx楼主2023/6/3 19:14
#include<bits/stdc++.h>
using namespace std;
const int kmaxn=3e6+10;
int f[kmaxn];
int d[kmaxn],siz[kmaxn],rp[kmaxn];
bool rt[kmaxn];
struct Tree{
  int l,r;
  vector<pair<int,int> >lp;
}a[kmaxn];
int an[kmaxn],ans,n,m,k,addnow=0;
pair<int,int>sadd[kmaxn];
int F(int x){
	if(f[x]==x){
		d[x]=1;
		return x;
	}else{
		F(f[x]);
		if(!rt[x])d[x]=(d[f[x]]?0:1);
		else d[x]=d[f[x]];
	}
	return F(f[x]);
}
void AddDad(int x,int y){
  int q=x,r=y;
  x=F(x);
  y=F(y);
  sadd[++addnow]={x,y};
  if(x==y){
    if(d[q]==d[r]){
      ans++;
    }
  }else{
    if(rp[x]<rp[y]){swap(x,y);swap(q,r);}
    f[y]=x;
    rp[x]+=rp[y];
    if(d[q]==d[r]&&d[x]!=d[y]){
    	rt[y]=1;
    }
    if(d[q]!=d[r]&&d[x]==d[y]){
      rt[y]=1;
    }
  }
}
void KillDad(int x,int y){
  int q=x,r=y;
  x=sadd[addnow].first;
  y=sadd[addnow].second;
  addnow--;
  if(x==y){
    if(d[q]==d[r]){
      ans--;
    }
  }else{
    if(rp[x]<rp[y])swap(x,y);
    f[y]=y;
    rp[x]-=rp[y];
    rt[y]=0;
    d[y]=0;
  }
}
void build(int x,int l,int r){
  int mid=(l+r)/2;
  a[x].l=l;
  a[x].r=r;
  if(l==r)return ;
  build(x*2,l,mid);
  build(x*2+1,mid+1,r);
  return ;
}
void add(int x,int l,int r,int dx,int dy){
  if(a[x].l>=l&&a[x].r<=r){
    a[x].lp.push_back({dx,dy});
    return ;
  }
  if(a[x].r<l||a[x].l>r){
    return ;
  }
  add(x*2,l,r,dx,dy);
  add(x*2+1,l,r,dx,dy);
}
void Find(int x){
  for(int i=0;i<a[x].lp.size();i++){
    AddDad(a[x].lp[i].first,a[x].lp[i].second);
  }
  if(a[x].l==a[x].r){
    an[a[x].l]=ans;
    for(int i=a[x].lp.size()-1;i>=0;i--){
      KillDad(a[x].lp[i].first,a[x].lp[i].second);
    }
    return ;
  }
  Find(x*2);
  Find(x*2+1);
  for(int i=a[x].lp.size()-1;i>=0;i--){
    KillDad(a[x].lp[i].first,a[x].lp[i].second);
  }
  return ;
}
int main(){
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin>>n>>m>>k;
  build(1,1,kmaxn/4);
  for(int i=1;i<=m;i++){
    int x,y,l,r;
    cin>>x>>y>>l>>r;
    add(1,l,r-1,x,y);
  }
  for(int i=1;i<=n;i++){
    f[i]=i;
    d[i]=1;
    rp[i]=1;
  }
  Find(1);
  for(int i=0;i<k;i++){
    cout<<(an[i]?"No":"Yes")<<endl;
  }
  return 0;
}

2023/6/3 19:14
加载中...