Luogu P2173 [ZJOI2012]网络
题意
写的比较清楚,我就不解释了。
\(\texttt{Data Range:}n\leq 10^4,m\leq 10^5,c\leq 10,k\leq 10^5\)
题解
注意到 \(c\) 的范围很小,而且把每种颜色的边抠出来发现是一个森林(准确的来说是每个连通块都是链),于是我们可以对每种颜色都开个 \(\texttt{LCT}\)。
然后这题就基本上是板子题了,但是这题细节很多,可能会花费你很多的调试时间。
有一个坑点就是当修改 \((u,v)\) 这条边的颜色的时候如果新的颜色等于原来的颜色无论怎样都是成功的,因为保证每一次操作后的图是满足性质的。
代码
#include<bits/stdc++.h>
using namespace std;
typedef int ll;
typedef long long int li;
const ll MAXN=2e5+51;
struct Edge{
ll to,prev,col;
};
Edge ed[MAXN<<1];
ll n,m,c,qcnt,tot,u,v,w,op,col;
ll deg[MAXN][10],last[MAXN];
inline ll read()
{
register ll num=0,neg=1;
register char ch=getchar();
while(!isdigit(ch)&&ch!='-')
{
ch=getchar();
}
if(ch=='-')
{
neg=-1;
ch=getchar();
}
while(isdigit(ch))
{
num=(num<<3)+(num<<1)+(ch-'0');
ch=getchar();
}
return num*neg;
}
namespace LCT{
struct Node{
ll fa,mx,val,rv,sz;
ll ch[2];
};
struct LinkCutTree{
Node nd[MAXN];
ll st[MAXN];
#define ls nd[x].ch[0]
#define rs nd[x].ch[1]
inline bool nroot(ll x)
{
return nd[nd[x].fa].ch[0]==x||nd[nd[x].fa].ch[1]==x;
}
inline void update(ll x)
{
nd[x].mx=max(max(nd[x].val,nd[ls].mx),nd[rs].mx);
}
inline void reverse(ll x)
{
swap(ls,rs),nd[x].rv^=1;
}
inline void spread(ll x)
{
if(nd[x].rv)
{
ls?reverse(ls):(void)(1),rs?reverse(rs):(void)(1);
nd[x].rv=0;
}
}
inline void rotate(ll x)
{
ll fa=nd[x].fa,gfa=nd[fa].fa;
ll dir=nd[fa].ch[1]==x,son=nd[x].ch[!dir];
if(nroot(fa))
{
nd[gfa].ch[nd[gfa].ch[1]==fa]=x;
}
nd[x].ch[!dir]=fa,nd[fa].ch[dir]=son;
if(son)
{
nd[son].fa=fa;
}
nd[fa].fa=x,nd[x].fa=gfa,update(fa);
}
inline void splay(ll x)
{
ll fa=x,gfa,cur=0;
st[++cur]=fa;
while(nroot(fa))
{
st[++cur]=fa=nd[fa].fa;
}
while(cur)
{
spread(st[cur--]);
}
while(nroot(x))
{
fa=nd[x].fa,gfa=nd[fa].fa;
if(nroot(fa))
{
rotate((nd[fa].ch[0]==x)^(nd[gfa].ch[0]==fa)?x:fa);
}
rotate(x);
}
update(x);
}
inline void access(ll x)
{
for(register int i=0;x;x=nd[i=x].fa)
{
splay(x),rs=i,update(x);
}
}
inline void makeRoot(ll x)
{
access(x),splay(x),reverse(x);
}
inline ll findRoot(ll x)
{
access(x),splay(x);
while(ls)
{
spread(x),x=ls;
}
return x;
}
inline void split(ll x,ll y)
{
makeRoot(x),access(y),splay(y);
}
inline void link(ll x,ll y)
{
makeRoot(x);
if(findRoot(y)!=x)
{
nd[x].fa=y;
}
}
inline void cut(ll x,ll y)
{
makeRoot(x);
if(findRoot(y)==x&&nd[x].fa==y&&!rs)
{
nd[x].fa=nd[y].ch[0]=0,update(y);
}
}
#undef ls
#undef rs
};
}
LCT::LinkCutTree lct[10];
inline void addEdge(ll from,ll to,ll col)
{
ed[++tot].prev=last[from];
ed[tot].to=to;
ed[tot].col=col;
last[from]=tot;
}
inline bool check(ll u,ll v,ll w)
{
ll col=-1;
for(register int i=last[u];i;i=ed[i].prev)
{
if(ed[i].to==v)
{
col=ed[i].col;
break;
}
}
if(col==-1)
{
return puts("No such edge."),0;
}
if(w==col)
{
return puts("Success."),1;
}
if(deg[u][w]==2||deg[v][w]==2)
{
return puts("Error 1."),0;
}
if(lct[w].findRoot(u)==lct[w].findRoot(v))
{
return puts("Error 2."),0;
}
return puts("Success."),1;
}
int main()
{
n=read(),m=read(),c=read(),qcnt=read();
for(register int i=1;i<=n;i++)
{
v=read();
for(register int j=0;j<c;j++)
{
lct[j].nd[i].val=v;
}
}
for(register int i=0;i<m;i++)
{
u=read(),v=read(),w=read(),lct[w].link(u,v);
deg[u][w]++,deg[v][w]++,addEdge(u,v,w),addEdge(v,u,w);
}
for(register int i=0;i<qcnt;i++)
{
op=read(),u=read(),v=read();
if(op==0)
{
for(register int j=0;j<c;j++)
{
lct[j].splay(u),lct[j].nd[u].val=v;
}
}
if(op==1)
{
if(check(u,v,w=read()))
{
for(register int j=last[u];j;j=ed[j].prev)
{
if(ed[j].to==v)
{
col=ed[j].col,ed[j].col=w;
break;
}
}
for(register int j=last[v];j;j=ed[j].prev)
{
if(ed[j].to==u)
{
ed[j].col=w;
break;
}
}
lct[col].cut(u,v),lct[w].link(u,v);
deg[u][col]--,deg[v][col]--,deg[u][w]++,deg[v][w]++;
}
}
if(op==2)
{
w=read(),swap(u,w);
if(lct[w].findRoot(u)!=lct[w].findRoot(v))
{
puts("-1");
continue;
}
lct[w].split(u,v),printf("%d\n",lct[w].nd[v].mx);
}
}
}
Luogu P2173 [ZJOI2012]网络的更多相关文章
- 洛谷 P2173 [ZJOI2012]网络 解题报告
P2173 [ZJOI2012]网络 题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环, ...
- Luogu 2173 [ZJOI2012]网络 - LCT
Solution $LCT$ 直接上$QuQ$ 注意$cut$ 完 需要 $d[u + c * N]--$ 再 $link$, 不然会输出Error 1的哦 Code #include<cs ...
- 洛谷P2173 [ZJOI2012]网络(10棵lct与瞎jb暴力)
有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这个图上,你 ...
- P2173 [ZJOI2012]网络
\(\color{#0066ff}{ 题目描述 }\) 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同 ...
- [Luogu 2604] ZJOI2010 网络扩容
[Luogu 2604] ZJOI2010 网络扩容 第一问直接最大流. 第二问,添加一遍带费用的边,边权 INF,超级源点连源点一条容量为 \(k\) 的边来限流,跑费用流. 大约是第一次用 nam ...
- BZOJ2816:[ZJOI2012]网络——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2816 https://www.luogu.org/problemnew/show/P2173 有一 ...
- BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)
题目连接: (luogu) https://www.luogu.org/problemnew/show/P2604 (bzoj) https://www.lydsy.com/JudgeOnline/p ...
- 【Luogu P3376】网络最大流
Luogu P3376 最大流是网络流模型的一个基础问题. 网络流模型就是一种特殊的有向图. 概念: 源点:提供流的节点(入度为0),类比成为一个无限放水的水厂 汇点:接受流的节点(出度为0),类比成 ...
- bzoj 2816: [ZJOI2012]网络 (LCT 建多棵树)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2816 题面: http://www.lydsy.com/JudgeOnline/upload ...
随机推荐
- 基于mockito做有效的单元测试
概述 本文讲解的主要是有效和单元的思想,并不是说如何编写单元测试,用于改善和提高开发效率.编码风格.编码可读性和单测效率,不盲目追求覆盖率. 背景 现在很多单元测试只是利用@Test注解把代码或者整个 ...
- Spring Boot 第六弹,拦截器如何配置,看这儿~
持续原创输出,点击上方蓝字关注我吧 目录 前言 Spring Boot 版本 什么是拦截器? 如何自定义一个拦截器? 如何使其在Spring Boot中生效? 举个栗子 思路 根据什么判断这个接口已经 ...
- 019 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 13 数据类型转换的代码示例
019 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 13 数据类型转换的代码示例 本文知识点:Java中的数据类型转换案例 学习视频有误,导致没法写文,文章内容 ...
- STM32之旅3——时钟数
STM32之旅3--时钟数 STM32F1是M3内核,它的时钟数很庞大,让一个初学者去看,估计会很吃力,和我们入门的8051单片机的时钟不同,这里又倍频.又分频,而且还分成好多个时钟,不同的外设时钟不 ...
- Candy (candy)
Description Due to its great contribution to the maintenance of world peace, Dzx was given an unlimi ...
- shell-整数测试多范例多生产案例举例
1. 整数测试举例范例1:整数条件测试举例 root@test-1 ~]# a1=10;a2=13 [root@test-1 ~]# echo $a1 $a2 10 13 [root@test-1 ~ ...
- 跨境 TCP 传输优化实录 — 使用 BBR 解决 LFN 问题
背景 近期开通了一条访问美国机房的 1G 专线,用于提供行情数据备源,并基于 TCP 建立了一套数据传输服务.上线后发现一个严重的问题:应用程序发送队列中的数据大量积压,最终导致程序 OOM Kill ...
- redis6安装 centos系统
Redis6 安装 在centos7.5服务器上按照官方发布的安装方式并不能进行正确的安装,现收集并整理如下安装方式,亲测有效 1.安装依赖 yum install -y cpp binutils ...
- anaconda 取消每次默认启动base环境
安装conda后取消命令行前出现的base,取消每次启动自动激活conda的基础环境 方法一: 每次在命令行通过conda deactivate退出base环境回到系统自动的环境 方法二 1,通过将a ...
- flask生产环境部署
1.安装uwsgipip install uwsgi 2.创建ini配置文件vim uwsgi.ini内容如下:[uwsgi]# 配置启动的服务地址和iphttp=0.0.0.0:5001# 项目目录 ...