比赛 2024暑假C班集训E 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWA
题目名称 部落冲突 最终得分 30
用户昵称 健康铀 运行时间 12.817 s
代码语言 C++ 内存使用 5.87 MiB
提交时间 2024-07-14 11:39:24
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,t,p,k,s[1200010],h[300010],maxx,tot,vis[300010],d1[300010],d2[300010],minx=1000001,m,res,zz[6010][3],cnt;
struct m{
    int ver,nx,ed;
}e[1200010];
void add(int x,int y){
    e[++tot].ver=y,e[tot].nx=h[x],e[tot].ed=1,h[x]=tot;
}
int dfs(int qd,int zd){
       memset(vis,0,sizeof(vis));
        queue <int> a;
        a.push(qd),vis[qd]=1;
        while(!a.empty()){
            int x=a.front();
            a.pop();
            for(int i=h[x];i;i=e[i].nx){
                int y=e[i].ver;
                if(!vis[y]&&e[i].ed==1)vis[y]=1,a.push(y);
            }
       }
       if(vis[zd]==1)
       return 1;
       else
       return 0;
}
void xg1(long long k,long long x,long long l,long long r){
    if(r<x||l>x){
        return;
    }
    if(l==r){
        s[k]=1; 
        return;
    }
    xg1(k*2,x,l,(r+l)/2);
    xg1(k*2+1,x,(r+l)/2+1,r);
    s[k]=s[k*2]+s[k*2+1];
}

void xg2(long long k,long long x,long long l,long long r){
    if(r<x||l>x){
        return;
    }
    if(l==r){
        s[k]=0; 
        return;
    }
    xg2(k*2,x,l,(r+l)/2);
    xg2(k*2+1,x,(r+l)/2+1,r);
    s[k]=s[k*2]+s[k*2+1];
}
void ask(long long k,long long x,long long y,long long l,long long r){
    if(l>y||r<x){
        return;
    }
    if(x<=l&&r<=y){
       res+=s[k];
       return;
    }
    ask(k*2,x,y,l,l+(r-l)/2);
    ask(k*2+1,x,y,l+(r-l)/2+1,r);
}
int main(){
    freopen("lct.in","r",stdin);
	freopen("lct.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n-1;i++){
        int x,y;
        cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    if(n>6000){
        while(m--){
        char cd;
        int l,r,z;
        cin>>cd;
        if(cd=='Q'){
            cin>>l>>r;
            res=0;
            ask(1,l,r-1,1,n-1);
           if(res==0){
               cout<<"Yes"<<endl;
           } 
           else{
               cout<<"No"<<endl;
           }
        }
        else if(cd=='C'){
            cin>>l>>r;
            xg1(1,l,1,n-1);
            zz[++cnt][1]=l,zz[cnt][2]=r;
        }
        else{
            cin>>z;
            l=zz[z][1],r=zz[z][2];
            xg2(1,l,1,n-1);
        }
       }
       return 0;
    }
    while(m--){
        char cd;
        int l,r,z;
        cin>>cd;
        if(cd=='Q'){
            cin>>l>>r;
           if(dfs(l,r)==1){
               cout<<"Yes"<<endl;
           } 
           else{
               cout<<"No"<<endl;
           }
        }
        else if(cd=='C'){
            cin>>l>>r;
            zz[++cnt][1]=l,zz[cnt][2]=r;
            for(int i=h[l];i;i=e[i].nx){
                int y=e[i].ver;
                if(y==r){
                    e[i].ed=0;
                    break;
                }
            }
            for(int i=h[r];i;i=e[i].nx){
                int y=e[i].ver;
                if(y==l){
                    e[i].ed=0;
                    break;
                }
            }
        }
        else{
            cin>>z;
            l=zz[z][1],r=zz[z][2];
            for(int i=h[l];i;i=e[i].nx){
                int y=e[i].ver;
                if(y==r){
                    e[i].ed=1;
                    break;
                }
            }
            for(int i=h[r];i;i=e[i].nx){
                int y=e[i].ver;
                if(y==l){
                    e[i].ed=1;
                    break;
                }
            }
        }
    }
    return 0;
}