• bzoj 2819


    2819

    思路:

      手工栈;

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    #define maxn 500005
    #define maxm maxn<<1
    #define maxtree maxn<<2
    int head[maxn],V[maxm],E[maxm],f[maxn],m,n;
    int deep[maxn],size[maxn],lar[maxn],stanow[maxn],statype[maxn];
    int stafa[maxn],stai[maxn],top[maxn],cnt,id[maxn],stachain[maxn];
    int dis[maxn],dis_[maxn],tree[maxn];
    inline void in(int &now)
    {
        char Cget=getchar();now=0;
        while(Cget>'9'||Cget<'0') Cget=getchar();
        while(Cget>='0'&&Cget<='9')
        {
            now=now*10+Cget-'0';
            Cget=getchar();
        }
    }
    /*void dfs(int now,int fa)
    {
        size[now]=1,deep[now]=deep[fa]+1,f[now]=fa;
        for(int i=head[now];i;i=E[i])
        {
            if(V[i]==fa) continue;
            dfs(V[i],now),size[now]+=size[V[i]];
            if(size[V[i]]>size[lar[now]]) lar[now]=V[i];
        }
    }*/
    void dfs1()
    {
        int now=1;stanow[now]=1,stafa[now]=0;
        flag1:
        deep[stanow[now]]=deep[stafa[now]]+1,size[stanow[now]]=1,f[stanow[now]]=stafa[now];
        for(stai[now]=head[stanow[now]];stai[now];stai[now]=E[stai[now]])
        {
            if(V[stai[now]]==stafa[now]) continue;
            now++,stanow[now]=V[stai[now-1]],stafa[now]=stanow[now-1];
            goto flag1;
            flag2:
            size[stanow[now]]+=size[V[stai[now]]];
            if(size[V[stai[now]]]>size[lar[stanow[now]]]) lar[stanow[now]]=V[stai[now]];
        }
        if(now==1) return;
        else
        {
            now--;
            goto flag2;
        }
    }
    /*
    void dfs2(int now,int chain)
    {
        top[now]=chain,id[now]=++cnt;
        if(lar[now]) dfs2(lar[now],now);
        for(int i=head[now];i;i=E[i])
        {
            if(V[i]==f[now]||V[i]==lar[now]) continue;
            dfs2(V[i],V[i]);
        }
    }
    */
    void dfs2()
    {
        int now=1;stanow[now]=1,stachain[now]=1;
    flag1:
        top[stanow[now]]=stachain[now],id[stanow[now]]=++cnt;
        if(lar[stanow[now]])
        {
            now++,stanow[now]=lar[stanow[now-1]],stachain[now]=stachain[now-1],statype[now]=1;
            goto flag1;
    flag2:;
        }
        for(stai[now]=head[stanow[now]];stai[now];stai[now]=E[stai[now]])
        {
            if(V[stai[now]]==f[stanow[now]]||V[stai[now]]==lar[stanow[now]]) continue;
            now++,stanow[now]=V[stai[now-1]],stachain[now]=V[stai[now-1]],statype[now]=2;
            goto flag1;
    flag3:;
        }
        if(now==1) return;
        else
        {
            now--;
            if(statype[now+1]==1) goto flag2;
            else goto flag3;
        }
    }
    #define lowbit(x) x&(-x)
    int change(int to,int x)
    {
        int d=to,tmp=x^dis_[to];
        while(d<=n) tree[d]^=tmp,d+=lowbit(d);
        dis_[to]=x;
    }
    int Query(int l,int r)
    {
        int res=0;l--;
        while(r) res^=tree[r],r-=lowbit(r);
        while(l) res^=tree[l],l-=lowbit(l);
        return res;
    }
    int query(int x,int y)
    {
        int res=0;
        while(top[x]!=top[y])
            if(deep[top[x]]>deep[top[y]]) res^=Query(id[top[x]],id[x]),x=f[top[x]];
            else res^=Query(id[top[y]],id[y]),y=f[top[y]];
        if(deep[x]>deep[y]) swap(x,y);
        return res^Query(id[x],id[y]);
    }
    int main()
    {
        in(n);int u,v;
        for(int i=1;i<=n;i++) in(dis[i]);
        for(int i=1;i<n;i++)
        {
            in(u),in(v);
            E[++cnt]=head[u],V[cnt]=v,head[u]=cnt;
            E[++cnt]=head[v],V[cnt]=u,head[v]=cnt;
        }
        cnt=0,dfs1(),dfs2();
        for(int i=1;i<=n;i++) change(id[i],dis[i]);
        in(m);char op[3];
        for(int i=1;i<=m;i++)
        {
            scanf("%s",op),in(u),in(v);
            if(op[0]=='C') change(id[u],v);
            else if(query(u,v)) printf("Yes
    ");
            else printf("No
    ");
        }
        return 0;
    }
  • 相关阅读:
    ruby **option作为函数参数,map的key必须是符号
    计算2..n的素数
    css,世界上没有绝对简单的事情
    modernizr的介绍和使用
    图解HTTP
    px、em、rem区别介绍
    web开发规范文档
    iscroll API
    sulime text 常用快捷键总结
    a href="javascript:void(0)"
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/7323745.html
Copyright © 2020-2023  润新知