QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#603065#8719. 后继ZariaTL 0ms0kbC++174.4kb2024-10-01 14:29:172024-10-01 14:29:18

Judging History

你现在查看的是最新测评结果

  • [2024-10-01 14:29:18]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2024-10-01 14:29:17]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
 
#define PLL pair<ll,ll>
#define ll long long
const ll N=2e5+10,mod=1e9+7;
ll n,m,q;
ll h[N],ne[N*2],e[N*2],idx;
ll bb[N],st[N];
ll fa[N][20],d[N],ud[N];
ll root;
bool sst[N];

void add(ll m,ll n){
    e[idx]=n,ne[idx]=h[m],h[m]=idx++;
}

void dfs(ll x){
    sst[x]=1;
    for(int i=1;(1<<i)<=d[x];i++)
    fa[x][i]=fa[fa[x][i-1]][i-1];

    for(int i=h[x];i!=-1;i=ne[i]){
        ll j=e[i];
        if(sst[j]==0){
            d[j]=d[x]+1;
            fa[j][0]=x;
            dfs(j);
        }
    }
}

ll lca(ll a,ll b){
    if(d[a]<d[b]) swap(a,b);

    for(int i=18;i>=0;i--){
        if(d[fa[a][i]]<d[b]) continue;
        a=fa[a][i];
    }

    if(a==b) return a;
    for(int i=18;i>=0;i--){
        if(fa[a][i]==fa[b][i]) continue;
        a=fa[a][i];
        b=fa[b][i];
    }

    return fa[a][0];
}

int main(){
    cin>>n>>m>>q;
    memset(h,-1,sizeof h);
    for(int i=1;i<=n-1;i++){
        int a,b;
        cin>>a>>b;
        add(a,b),add(b,a);
    }

    d[1]=1;
    dfs(1);
    
    for(int i=1;i<=m;i++){
        cin>>bb[i];
    }
    ud[1]=0;
    st[1]=1;
    ll t=lca(bb[1],bb[2]);
    if(t==bb[1]){
        ud[2]=1;//1 下 2 上
    }
    if(t==bb[2]){
        ud[2]=2;
    }
    if(t!=bb[1]&&t!=bb[2]){
        ud[2]=1;
    }
    for(int i=2;i<n;i++){
        t=lca(bb[i],bb[i+1]);
        if(t!=bb[i]&&t!=bb[i+1]){
            ud[i+1]=1;
            st[i]=1;
        }
        if(t==bb[i]){
            if(ud[i]==2){
                st[i]=1;
                ud[i+1]=1;
            }
            else{
                st[i]=0;
                ud[i+1]=1;
            }
        }
        if(t==bb[i+1]){
            if(ud[i]==2){
                st[i]=0;
                ud[i+1]=2;
            }
            else{
                st[i]=1;
                ud[i+1]=2;
            }
        }
    }
    ll res=0;
    st[n]=1;

    for(int i=1;i<=n;i++){
        if(st[i]==1) res++;
    }

    for(int i=1;i<=q;i++){
        ll p,w;
        cin>>p>>w;
        bb[p]=w;
        if(p==1){
            ll pre=ud[2];
            t=lca(bb[1],bb[2]);
            if(t==bb[1]){
                ud[2]=1;//1 下 2 上
            }
            if(t==bb[2]){
                ud[2]=2;
            }
            if(t!=bb[1]&&t!=bb[2]){
                ud[2]=1;
            }
            if(pre!=ud[2]){
                pre=st[2];
                if(ud[2]==ud[3]){
                    st[2]==0;
                }
                else{
                    st[2]==1;
                }
                res+=st[2]-pre;
            }
        }
        if(p==n){
            ll pre=ud[n];
            t=lca(bb[n-1],bb[n]);
            if(t==bb[n]){
                ud[n]=2;//1 下 2 上
                if(pre!=ud[n]){
                    pre=st[n-1];
                    st[n-1]=1;
                    res+=st[n-1]-pre;
                }
            }
            if(t==bb[n-1]){
                ud[n]=1;
                if(pre!=ud[n]){
                    pre=st[n-1];
                    st[n-1]=1;
                    res+=st[n-1]-pre;
                }
            }
            if(t!=bb[n-1]&&t!=bb[n]){
                ud[n]=1;
                if(pre!=ud[n]){
                    pre=st[n-1];
                    st[n-1]=1;
                    res+=st[n-1]-pre;
                }
            }
        }
        if(p!=1&&p!=n){
            ll pre=st[p-1]+st[p]+st[p+1];
            for(int j=p-1;j<=p+1;j++){
                t=lca(bb[j],bb[j+1]);
                if(t!=bb[j]&&t!=bb[j+1]){
                    ud[j+1]=1;
                    st[j]=1;
                }
                if(t==bb[j]){
                    if(ud[j]==2){
                        st[j]=1;
                        ud[j+1]=1;
                    }
                    else{
                        st[j]=0;
                        ud[j+1]=1;
                    }
                }
                if(t==bb[j+1]){
                    if(ud[j]==2){
                        st[j]=0;
                        ud[j+1]=2;
                    }
                    else{
                        st[j]=1;
                        ud[j+1]=2;
                    }
                }
            }
            res+=st[p-1]+st[p]+st[p+1]-pre;
        }
        cout<<res<<endl;
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Time Limit Exceeded

input:

5 1
1 2 3 4 5

output:


result: