bzoj 2816: [ZJOI2012]网络 (LCT 建多棵树)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2816
题面: http://www.lydsy.com/JudgeOnline/upload/zjoi2012.pdf
思路:
因为c很小,我们可以建c棵树,然后跑LCT。
实现代码:
#include<bits/stdc++.h>
using namespace std;
const int M = 3e5+;
const int inf = 0x3f3f3f3f; struct node{
int u,v;
};
int a[M];
int col[M][];
bool operator < (node a,node b){
if(a.u == b.u) return a.v < b.v;
return a.u < b.u;
}
map<node,int>mp;
struct lct{
int c[M][],fa[M],val[M],sum[M],rev[M],st[M];
inline void up(int x){
int l = c[x][],r = c[x][];
sum[x] = max(max(sum[l],sum[r]),val[x]);
} inline void pushrev(int x){
int t = c[x][];
c[x][] = c[x][]; c[x][] = t;
rev[x] ^= ;
} inline void pushdown(int x){
if(rev[x]){
int l = c[x][],r = c[x][];
if(l) pushrev(l);
if(r) pushrev(r);
rev[x] = ;
}
} inline bool nroot(int x){ //判断一个点是否为一个splay的根
return c[fa[x]][]==x||c[fa[x]][] == x;
} inline void rotate(int x){
int y = fa[x],z = fa[y],k = c[y][] == x;
int w = c[x][!k];
if(nroot(y)) c[z][c[z][]==y]=x;
c[x][!k] = y; c[y][k] = w;
if(w) fa[w] = y; fa[y] = x; fa[x] = z;
up(y);
} inline void splay(int x){
int y = x,z = ;
st[++z] = y;
while(nroot(y)) st[++z] = y = fa[y];
while(z) pushdown(st[z--]);
while(nroot(x)){
y = fa[x];z = fa[y];
if(nroot(y))
rotate((c[y][]==x)^(c[z][]==y)?x:y);
rotate(x);
}
up(x);
} //打通根节点到指定节点的实链,使得一条中序遍历从根开始以指定点结束的splay出现
inline void access(int x){
for(int y = ;x;y = x,x = fa[x])
splay(x),c[x][]=y,up(x);
} inline void makeroot(int x){ //换根,让指定点成为原树的根
access(x); splay(x); pushrev(x);
} inline int findroot(int x){ //寻找x所在原树的树根
access(x); splay(x);
while(c[x][]) pushdown(x),x = c[x][];
splay(x);
return x;
} inline void split(int x,int y){ //拉出x-y的路径成为一个splay
makeroot(x); access(y); splay(y);
} inline void cut(int x,int y){ //断开边
makeroot(x);
if(findroot(y) == x&&fa[y] == x&&!c[y][]){
fa[y] = c[x][] = ;
up(x);
}
} inline void link(int x,int y){ //连接边
makeroot(x);
if(findroot(y)!=x) fa[x] = y;
}
}LCT[];
int main()
{
int n,m,c,k;
scanf("%d%d%d%d",&n,&m,&c,&k);
for(int i = ;i <= n;i ++) scanf("%d",&a[i]);
for(int i = ;i <= n;i ++){
for(int j = ;j <= c;j ++){
LCT[j].val[i] = a[i];
}
}
int u,v,w;
for(int i = ;i <= m;i ++){
scanf("%d%d%d",&u,&v,&w); w++;
mp[(node){u,v}] = w;
mp[(node){v,u}] = w;
col[u][w]++; col[v][w]++;
LCT[w].link(u,v);
}
int op,x,y;
while(k--){
scanf("%d",&op);
if(op == ){
scanf("%d%d",&x,&y); a[x] = y;
for(int i = ;i <= c;i ++){
LCT[i].splay(x);
LCT[i].val[x] = a[x];
}
}
else if(op == ){
scanf("%d%d%d",&u,&v,&w); w++;
int f = mp[(node){u,v}];
if(!f) {
printf("No such edge.\n");
continue;
}
if(f == w){
printf("Success.\n");
continue;
}
if(col[u][w]>||col[v][w]>){
printf("Error 1.\n"); continue;
}
if(LCT[w].findroot(u)==LCT[w].findroot(v)){
printf("Error 2.\n"); continue;
}
col[u][f]--; col[v][f]--;
col[u][w]++; col[v][w]++;
mp[(node){u,v}] = w;
mp[(node){v,u}] = w;
LCT[f].cut(u,v);
LCT[w].link(u,v);
printf("Success.\n");
}
else{
scanf("%d%d%d",&w,&u,&v); w++;
if(LCT[w].findroot(u)!=LCT[w].findroot(v)){
printf("-1\n"); continue;
}
LCT[w].split(u,v);
printf("%d\n",LCT[w].sum[v]);
}
}
}
bzoj 2816: [ZJOI2012]网络 (LCT 建多棵树)的更多相关文章
- BZOJ.2816.[ZJOI2012]网络(LCT)
题目链接 BZOJ 洛谷 对每种颜色维护一个LCT,保存点之间的连接关系. 修改权值A[x]和所有Max[x]都要改: 修改边的颜色先枚举所有颜色,看是否在某种颜色中有边,然后断开.(枚举一遍就行啊 ...
- 【刷题】BZOJ 2816 [ZJOI2012]网络
Description http://www.lydsy.com/JudgeOnline/upload/zjoi2012.pdf Solution 维护树上联通块的信息,支持动态加边删边 LCT 总共 ...
- bzoj 2816: [ZJOI2012]网络(splay)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2816 [题意] 给定一个无向图,满足条件:从一个节点出发的同色边不超过2条,且不存在同 ...
- 洛谷 2173 BZOJ 2816 [ZJOI2012]网络
[题解] 明显的LCT模板题,c种颜色就开c棵LCT好了.. #include<cstdio> #include<algorithm> #define N 100010 #de ...
- ZJOI2012 网络——LCT相关题目
有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这个图上,你 ...
- Luogu 2173 [ZJOI2012]网络 - LCT
Solution $LCT$ 直接上$QuQ$ 注意$cut$ 完 需要 $d[u + c * N]--$ 再 $link$, 不然会输出Error 1的哦 Code #include<cs ...
- BZOJ2816:[ZJOI2012]网络(LCT)
Description 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构 ...
- luoguP2173 [ZJOI2012]网络 LCT
链接 luogu 思路 颜色很少,开10个lct分别维护 if (Hash.count(make_pair(u, v)) && Hash[make_pair(u, v)] == col ...
- 2816: [ZJOI2012]网络
传送们 把一个点拆成c个即可 浪费时间的水题... //Achen #include<algorithm> #include<iostream> #include<cst ...
随机推荐
- MyEclipse自动补全
打开MyEclipse 6.5,然后"window"→"Preferences". 选择"java",展开,"Editor&quo ...
- 2019-02-18 扩展Python控制台实现中文反馈信息之二-正则替换
"中文编程"知乎专栏原文地址 续前文扩展Python控制台实现中文反馈信息, 实现了如下效果: >>> 学 Traceback (most recent call ...
- AEAI HR薪资汇总功能介绍
1 概述 人力资源系统是一个公司重要的管理工具,而薪资管理是人力资源管理系统中最为核心的功能模块,它包括不同员工的薪资标准.薪资的组成部分,例如:对奖惩管理.保险和年假等员工必备的福利待遇进行统一管理 ...
- 从零学习Flutter(一):初识Dart
Fluter是Google推出的跨平台开发App的一套框架,很多人都说,Google出品比属于金品,故,我也来凑凑热闹,Fluter是用Dart写的,所以在用Fluter之前,我们还是有必要简单了解一 ...
- QT之Http请求
今天我们介绍一下QT的http请求,这里有post和get两种方式 一.post请求方式:参数分为网址和具体请求值两个部分,有时候还需要设置头信息,看具体情况定 void MainWindow::se ...
- sql server中嵌套事务*
转自 https://www.cnblogs.com/guanjie20/archive/2013/02/17/2914488.html 我们在写事务时经常遇到的问题如下: 消息 266,级别 16, ...
- Python基础——1基础
1.基础 输出 print(‘把子肉爱上热干面’,‘哈哈’) # ‘,’输出为空格 输人 name = input(‘提示的内容’) /浮点除法 %.6f //地板除法 整除 % 取余 pyt ...
- 新的编辑工具IDE
因为最近一段时间前端都是用EXTJS开发,之前用vs2012来编辑extjs,感觉缺少智能感应,很不方便.后来发现一款工具Visual Studio Code,非常棒. VS Code是免费,轻量,跨 ...
- 0109 ubuntu nginx ssl
1. sudo apt-get install openssl libssl-dev # ./configure --with-http_stub_status_module --with-http_ ...
- vue 在safari动态多级面包屑导航样式不刷新的bug
前言: 最近做公司的管理系统,用到了elementUI 里面的 bread面包屑组件,本来一切好好的,谁知道mac的safari样式全部缓存了,硬是下面这种效果,真头疼 而chrome,QQ均显示正常 ...