zoukankan      html  css  js  c++  java
  • AC日记——[ZJOI2012]网络 bzoj 2816

    2816

    思路:

      多个LCT;

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    #define maxn 10005
    #define ll long long
    int val[maxn];
    struct LinkCutTreeType {
            int f[maxn],Max[maxn],ch[maxn][2],rev[maxn],sta[maxn],top,cnt[maxn];
            void updata(int now)
            {
                Max[now]=val[now];
                if(ch[now][1]) Max[now]=max(Max[now],Max[ch[now][1]]);
                if(ch[now][0]) Max[now]=max(Max[now],Max[ch[now][0]]);
            }
            void downdata(int now)
            {
                if(rev[now])
                {
                    rev[now]^=1,swap(ch[now][1],ch[now][0]);
                    if(ch[now][1]) rev[ch[now][1]]^=1;
                    if(ch[now][0]) rev[ch[now][0]]^=1;
                }
            }
            bool isroot(int now)
            {
                return (ch[f[now]][1]!=now)&&(ch[f[now]][0]!=now);
            }
            void rotate(int now)
            {
                int fa=f[now],ffa=f[fa],l=(ch[fa][1]==now),r=l^1;
                if(!isroot(fa)) ch[ffa][ch[ffa][1]==fa]=now;
                f[now]=ffa,f[fa]=now,ch[fa][l]=ch[now][r],ch[now][r]=fa;
                if(ch[fa][l]) f[ch[fa][l]]=fa;updata(fa);
            }
            void splay(int now)
            {
                top=1,sta[1]=now;int fa,ffa;
                for(int i=now;!isroot(i);i=f[i]) sta[++top]=f[i];
                while(top) downdata(sta[top--]);
                while(!isroot(now))
                {
                    fa=f[now],ffa=f[fa];
                    if(!isroot(fa)) rotate(((ch[ffa][1]==fa)^(ch[fa][1]==now))?now:fa);
                    rotate(now);
                }
                updata(now);
            }
            void access(int now)
            {
                for(int i=0;now;i=now,now=f[now]) splay(now),ch[now][1]=i;
            }
            void makeroot(int now)
            {
                access(now),splay(now),rev[now]^=1;
            }
            void cut(int x,int y)
            {
                makeroot(x),access(y),splay(y);
                f[x]=0,ch[y][0]=0,cnt[x]--,cnt[y]--;
            }
            void link(int x,int y)
            {
                makeroot(x),f[x]=y,splay(x),cnt[x]++,cnt[y]++;
            }
            bool iscon(int x,int y)
            {
                while(f[x]) x=f[x];
                while(f[y]) y=f[y];
                return x==y;
            }
            int query(int u,int v)
            {
                makeroot(u),access(v),splay(v);
                return Max[v];
            }
    };
    struct LinkCutTreeType lct[15];
    int n,m,c,k;
    map<ll,int>Map;
    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();
        }
    }
    ll Mapped(int u,int v)
    {
        if(u>v) swap(u,v);
        return (ll)u*n*n+v;
    }
    int main()
    {
        //freopen("data.txt","r",stdin);
        freopen("networkzj.in","r",stdin);
        freopen("networkzj.out","w",stdout);
        in(n),in(m),in(c),in(k);int u,v,w,op;ll pos,id;
        for(int i=1;i<=n;i++) in(val[i]);
        while(m--) in(u),in(v),in(w),Map[Mapped(u,v)]=w+1,lct[w].link(u,v);
        while(k--)
        {
            in(op);
            if(op==0)
            {
                in(u),in(val[u]);
                for(int i=0;i<c;i++) lct[i].splay(u);
            }
            if(op==1)
            {
                in(u),in(v),in(w),id=Mapped(u,v),pos=Map[id]-1;
                if(pos<0)
                {
                    puts("No such edge.");
                    continue;
                }
                if(pos==w)
                {
                    puts("Success.");
                    continue;
                }
                if(lct[w].cnt[u]>=2||lct[w].cnt[v]>=2)
                {
                    puts("Error 1.");
                    continue;
                }
                if(lct[w].iscon(u,v))
                {
                    puts("Error 2.");
                    continue;
                }
                lct[pos].cut(u,v),lct[w].link(u,v),Map[id]=w+1;
                puts("Success.");
            }
            if(op==2)
            {
                in(w),in(u),in(v);
                if(!lct[w].iscon(u,v))
                {
                    puts("-1");
                    continue;
                }
                printf("%d
    ",lct[w].query(u,v));
            }
        }
        return 0;
    }
  • 相关阅读:
    软件实施工程师是一个什么样的工作?他的具体工作内容是什么?发展前景怎样?
    做金融(基金、证券)方面的软件实施工程师有没有发展前途?职业发展空间如何。
    做软件实施工程师的一点建议
    系统实施工程师主要工作职则
    软件实施工程师
    UE编辑器编译和运行java设置
    猜数字
    猜数字
    Problem G
    Problem G
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/7041447.html
Copyright © 2011-2022 走看看