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\n",lct[w].query(u,v));
        }
    }
    return 0;
}
时间: 2024-12-17 23:59:07

AC日记——[ZJOI2012]网络 bzoj 2816的相关文章

AC日记——无线网络发射器选址 洛谷 P2038

题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻的平行街道之间的距离都是恒定值 1 .东西向街道从北到南依次编号为0,1,2…128 , 南北向街道从西到东依次编号为0,1,2…128 . 东西向街道和南北向街道相交形成路口,规定编号为x 的南北向街道和编号为y 的东西向街道形成的路口的坐标是(x , y ). 在 某 些 路口存在一定数量的公共

AC日记——[Hnoi2017]影魔 bzoj 4826

4826 思路: 主席树矩阵加减+单调栈预处理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 200005 #define ll long long #define maxtree maxn*30 class PTreeType { private: int ch[maxtree][2],root[maxn],tot,head[maxn],li[maxn<<1],ri[maxn<<1],E

AC日记——[SCOI2007]蜥蜴 bzoj 1066

1066 思路: 网络流最大流: 拆点,每个点拆成两个,流量为这个点的高度: 注意,文中说的距离是曼哈顿距离(劳资以为开根号wa了不知道多少次): 每两个距离不大于d的点连边,流量inf: 如果距离能够延伸到边界外,就将这个点连向t: 最后输出,蜥蜴个数减去最大流: 来,上代码: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <alg

AC日记——Rmq Problem bzoj 3339

3339 思路: 恶心: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 200005 struct TreeNodeType { int l,r,dis,mid,flag; bool if_; }; struct TreeNodeType tree[maxn<<2

AC日记——[Ahoi2013]作业 bzoj 3236

3236 思路: 莫队+树状数组维护: 代码: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 100005 struct QueryType { int l,r,a,b,id; }; struct QueryType qu[maxn*10

AC日记——[HNOI2008]越狱 bzoj 1008

1008 思路: 越狱情况=总情况-不越狱情况: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define ll long long ll poww(ll x,ll e,ll k) { ll res=1,pos=x;pos%=k; while(e) { if(e&1) res=(res*p

AC日记——NOI2016区间 bzoj 4653

4653 思路: 线段树,指针滑动: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1000005 #define maxm 200005 #define maxn_ maxn<<2 #define INF 0x7fffffff struct TreeNodeType { int l,r,dis,mid,flag; }; struct TreeNodeType tree[maxn_]; struct Q

AC日记——Aragorn&#39;s Story HDU 3966

Aragorn's Story Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10510    Accepted Submission(s): 2766 Problem Description Our protagonist is the handsome human prince Aragorn comes from The Lor

[ZJOI2012]网络

[ZJOI2012]网络 题目 思路 显然,这是一道lct裸题.因为颜色不多,所以对于每一种颜色的边我们都建一个lct即可.(我这里是用 (颜色×n+点的标号) 表示每一种颜色lct) 操作0 因为我们对于每一种颜色的边都建了一个lct所以,我们对于每一种颜色的边都update一次.(虽然很暴力,但跑得过) 操作1 1.其实对于判断边不存在的情况,我们可以用临接矩阵来存,开一个bool数组10000*10000 128M还是开得下的.这样节约了很多时间(其实是我懒得想其它方法判断). 2.错误1