http://www.lydsy.com/JudgeOnline/problem.php?id=2816

每种颜色搞一个LCT

判断u v之间有边直接相连:

如果u和v之间有边相连,那么他们的深度相差1

所以

make_root(u);

access(v);

splay(v);

判断u的父亲是不是v 以及 u是不是没有右儿子

#include<cstdio>
#include<iostream> using namespace std; #define N 10001 void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} struct LCT
{
int ch[N][],fa[N];
int key[N],mx[N];
int d[N]; bool rev[N]; int st[N],top; void update(int x)
{
mx[x]=key[x];
mx[x]=max(mx[x],mx[ch[x][]]);
mx[x]=max(mx[x],mx[ch[x][]]);
} void down(int x)
{
if(rev[x])
{
rev[x]^=;
swap(ch[x][],ch[x][]);
rev[ch[x][]]^=;
rev[ch[x][]]^=;
}
} bool getson(int x)
{
return ch[fa[x]][]==x;
} bool isroot(int x)
{
return ch[fa[x]][]!=x && ch[fa[x]][]!=x;
} void rotate(int x)
{
int y=fa[x],z=fa[y];
bool k=ch[y][]==x;
if(!isroot(y)) ch[z][ch[z][]==y]=x;
ch[y][k]=ch[x][k^]; ch[x][k^]=y;
fa[y]=x; fa[x]=z; fa[ch[y][k]]=y;
update(y);
} void splay(int x)
{
st[top=]=x;
for(int i=x;!isroot(i);i=fa[i])
st[++top]=fa[i];
for(int i=top;i;--i) down(st[i]);
int y;
while(!isroot(x))
{
y=fa[x];
if(!isroot(y)) rotate(getson(x)==getson(y) ? y : x);
rotate(x);
}
update(x);
} void access(int x)
{
int t=;
while(x)
{
splay(x);
ch[x][]=t;
update(x);
t=x; x=fa[x];
}
} void make_root(int x)
{
access(x);
splay(x);
rev[x]^=;
} void link(int x,int y)
{
make_root(x);
fa[x]=y;
d[x]++; d[y]++;
splay(x);
} void cut(int x,int y)
{
make_root(x);
access(y);
splay(y);
ch[y][]=fa[x]=;
update(y);
d[x]--; d[y]--;
} int findroot(int x)
{
access(x);
splay(x);
while(ch[x][]) x=ch[x][];
return x;
} bool query(int x,int y)
{
int a=findroot(x);
int b=findroot(y);
return a==b;
} bool query_edge(int u,int v)
{
make_root(u);
access(v);
splay(v);
return fa[u]==v && !ch[u][];
} }Lct[]; int main()
{
freopen("networkzj.in","r",stdin);
freopen("networkzj.out","w",stdout);
int n,m,c,q;
read(n); read(m); read(c); read(q);
int u,v,w,k;
for(int i=;i<=n;++i)
{
read(w);
for(int j=;j<c;++j) Lct[j].key[i]=Lct[j].key[i]=w;
}
while(m--)
{
read(u); read(v); read(w);
Lct[w].link(u,v);
}
while(q--)
{
read(k);
if(!k)
{
read(u); read(w);
for(int i=;i<c;++i)
{
Lct[i].make_root(u);
Lct[i].key[u]=w;
Lct[i].update(u);
}
}
else if(k==)
{
read(u); read(v); read(w);
int i;
for(i=;i<c;++i)
if(Lct[i].query_edge(u,v) ) break;
if(i==c) { puts("No such edge."); continue; }
if(i==w) { puts("Success."); continue; }
if(Lct[w].d[u]== || Lct[w].d[v]==) { puts("Error 1."); continue; }
if(Lct[w].query(u,v)) { puts("Error 2."); continue; }
Lct[i].cut(u,v);
Lct[w].link(u,v);
puts("Success.");
}
else
{
read(w); read(u); read(v);
if(!Lct[w].query(u,v)) { puts("-1"); continue; }
Lct[w].make_root(u);
Lct[w].access(v);
Lct[w].splay(v);
cout<<Lct[w].mx[v]<<'\n';
}
}
}

bzoj千题计划223:bzoj2816: [ZJOI2012]网络的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划136:bzoj3931: [CQOI2015]网络吞吐量

    http://www.lydsy.com/JudgeOnline/problem.php?id=3931 在最短路网络上跑最大流 #include<queue> #include<c ...

  3. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  4. bzoj千题计划192:bzoj1569: [JSOI2008]Blue Mary的职员分配

    http://www.lydsy.com/JudgeOnline/problem.php?id=1569 dp[i][j][a][b] 表示i个职员,发广告状态为j,已有金钱a,声誉b的最少天数 j= ...

  5. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  6. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  7. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  8. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  9. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

随机推荐

  1. 《Effective Java》学习笔记 —— 枚举、注解与方法

    Java的枚举.注解与方法... 第30条 用枚举代替int常量 第31条 用实例域代替序数 可以考虑定义一个final int 代替枚举中的 ordinal() 方法. 第32条 用EnumSet代 ...

  2. python代码实现经典排序算法

    排序算法在程序中有至关重要的作用, 不同算法的时间复杂度和空间复杂度都有所区别, 这影响着程序运行的效率和资源占用的情况, 经常对一些算法多加练习, 强化吸收, 可以提高对算法的理解, 进而运用到实践 ...

  3. python基础篇----基本数据类型

    bit  #bit_length 当前数字的二进制,只用用n位来表示a = 123b = a.bit_length()print(b)#==>7

  4. telnet协议:简介与安装使用

    Telnet简介 Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力.在终端使用者的电脑上使用teln ...

  5. linux使用curl上传文件并且同时携带其它传递参数

    一般使用linux原生态的命令curl上传文件时命令如下 假如要上传文件是myfile.txt curl -F "file_name=@myfile.txt" -X POST &q ...

  6. 2-Sixteenth Scrum Meeting-20151216

    任务安排 成员 今日完成 明日任务 闫昊 写完学习进度记录的数据库操作  写完学习进度记录的数据库操作 唐彬 编写与服务器交互的代码  编写与服务器交互的代码 史烨轩 获取视频url   余帆  本地 ...

  7. Linux 第六周实验

    姬梦馨 原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程控制块PCB——task_st ...

  8. javascript 函数的几种声明函数以及应用环境

    本页只列出常用的几种方式,当然还有比如new Function()以及下面三种的组合. 1.函数式声明 例子:function sum(a,b){ return a+b; }; 2.函数表达式声明(匿 ...

  9. c++ 读写功能

    课程作业三 git链接: Operations 感想        这次代码修改的地方主要有,加入了文件读写.读出功能,以及分离函数写到了头文件里.        但是也有很多不足的地方,首先本来想要 ...

  10. Error:java: 无效的源发行版: 1.8

    出现这种情况是gradle或者maven的版本与 本地电脑jdk不一致,具体看一下链接 http://blog.csdn.net/leixingbang1989/article/details/519 ...