很好的一道LCT题目

首先我们可以发现,题目要求的就是最小生成树上的一条树链的最长边的长度,因此我们实际只需动态维护最小生成树即可

然后我们考虑怎么动态维护最小生成树

不难发现,如果涉及在最小生成树上删边,那么这个操作将变得非常复杂,因为我们并不知道删边之后要把什么样的边补充回去才行

但是,如果我们倒序操作,把删边变成加边,那么这个操作就变得相对简单了

回到本题,首先,我们把一定不会删的边建成一棵最小生成树(或者一个森林?),这就是我们的初始状态

然后,倒序操作,每次把删边变为加边,这样每次加入一条边时,我们只需讨论这两个点原先是否联通即可

如果两个点原先就联通,那么我们就找到这两个点所在联通块里边权最大的边,删去那条边之后加入这条新来的边即可

但是LCT难以维护边权,因此我们对每条边虚拟一个有点权的点,加边时把边的两个端点连到这个点上即可

删边同理

注意维护边的编号

贴代码:

(这个东西由于常数过于巨大在bzoj上过不去,但是luogu上的数据减弱版能过)

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
using namespace std;
struct Ques
{
int x,y,typ,num;
}q[1000005];
struct Edge
{
int l,r,v;
friend bool operator < (Edge a,Edge b)
{
return a.v<b.v;
}
}edge[1000005];
map <pair<int,int>,int> M;
int n,m,Q;
int ch[2000005][2];
int vis[2000005];
int maxx[2000005];
int val[2000005];
int f[2000005];
int fl[2000005];
int ret[2000005];
void update(int x)
{
maxx[x]=val[x];
if(edge[maxx[ch[x][0]]].v>edge[maxx[x]].v)maxx[x]=maxx[ch[x][0]];
if(edge[maxx[ch[x][1]]].v>edge[maxx[x]].v)maxx[x]=maxx[ch[x][1]];
}
bool be_root(int x)
{
if(ch[f[x]][0]==x||ch[f[x]][1]==x)return 0;
return 1;
}
void pushdown(int x)
{
if(fl[x])
{
swap(ch[ch[x][0]][0],ch[ch[x][0]][1]);
swap(ch[ch[x][1]][0],ch[ch[x][1]][1]);
fl[ch[x][0]]^=1,fl[ch[x][1]]^=1;
fl[x]=0;
}
}
void repush(int x)
{
if(!be_root(x))repush(f[x]);
pushdown(x);
}
void rotate(int x)
{
int y=f[x],z=f[y],k=(ch[y][1]==x);
if(!be_root(y))ch[z][ch[z][1]==y]=x;
f[x]=z;
ch[y][k]=ch[x][!k],f[ch[x][!k]]=y;
ch[x][!k]=y,f[y]=x;
update(y),update(x);
}
void splay(int x)
{
repush(x);
while(!be_root(x)&&x)
{
int y=f[x],z=f[y];
if(!be_root(y)&&y)
{
if((ch[y][1]==x)^(ch[z][1]==y))rotate(x);
else rotate(y);
}
rotate(x);
}
update(x);
}
void access(int x)
{
int y=0;
while(x)
{
splay(x);
ch[x][1]=y;
update(x);
y=x,x=f[x];
}
}
void makeroot(int x)
{
access(x),splay(x);
swap(ch[x][0],ch[x][1]),fl[x]^=1;
}
void link(int x,int y)
{
makeroot(x);
f[x]=y;
}
void split(int x,int y)
{
makeroot(x),access(y),splay(y);
}
void cut(int x,int y)
{
split(x,y),ch[y][0]=f[x]=0,update(y);
}
int findf(int x)
{
access(x),splay(x),pushdown(x);
while(ch[x][0])x=ch[x][0],pushdown(x);
return x;
}
inline int read()
{
int f=1,x=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main()
{
n=read(),m=read(),Q=read();
for(int i=1;i<=m;i++)
{
edge[i].l=read(),edge[i].r=read(),edge[i].v=read();
if(edge[i].l>edge[i].r)swap(edge[i].l,edge[i].r);
}
sort(edge+1,edge+m+1);
for(int i=1;i<=m;i++)M[make_pair(edge[i].l,edge[i].r)]=i;
for(int i=1;i<=Q;i++)
{
q[i].typ=read(),q[i].x=read(),q[i].y=read();
if(q[i].x>q[i].y)swap(q[i].x,q[i].y);
if(q[i].typ==2)
{
int t=M[make_pair(q[i].x,q[i].y)];
q[i].num=t,vis[t]=1;
}
}
for(int i=1;i<=m;i++)maxx[i+n]=val[i+n]=i;
for(int i=1;i<=m;i++)
{
if(vis[i])continue;
int f1=findf(edge[i].l),f2=findf(edge[i].r);
if(f1==f2)continue;
link(edge[i].l,i+n),link(edge[i].r,i+n);
}
int temp=Q;
while(Q)
{
if(q[Q].typ==1)
{
split(q[Q].x,q[Q].y);
ret[Q]=edge[maxx[q[Q].y]].v;
}else
{
split(q[Q].x,q[Q].y);
int t=maxx[q[Q].y];
if(edge[q[Q].num].v<edge[maxx[q[Q].y]].v)
{
cut(edge[t].l,t+n);
cut(edge[t].r,t+n);
link(edge[q[Q].num].l,q[Q].num+n);
link(edge[q[Q].num].r,q[Q].num+n);
}
}
Q--;
}
for(int i=1;i<=temp;i++)if(q[i].typ==1)printf("%d\n",ret[i]);
return 0;
}

bzoj 2594的更多相关文章

  1. [BZOJ 2594] [Wc2006]水管局长数据加强版 【LCT】

    题目链接:BZOJ - 2594 题目分析 这道题如果没有删边的操作,那么就是 NOIP2013 货车运输,求两点之间的一条路径,使得边权最大的边的边权尽量小. 那么,这条路径就是最小生成树上这两点之 ...

  2. bzoj 2594: [Wc2006]水管局长数据加强版 动态树

    2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 934  Solved: 291[Submit][Sta ...

  3. BZOJ 2594: [Wc2006]水管局长数据加强版( LCT )

    离线然后就是维护加边的动态MST, Link cut tree秒掉..不过我写+调了好久...时间复杂度O(NlogN + MlogM) ------------------------------- ...

  4. BZOJ 2594: [Wc2006]水管局长数据加强版 [LCT kruskal]

    2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 2917  Solved: 918[Submit][St ...

  5. BZOJ 2594 水管局长数据加强版(动态树)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2594 题意:给出一个无向图,边有权值.定义一条路径的长度为该路径所有边的最大值.两种操作 ...

  6. BZOJ 2594: [Wc2006]水管局长数据加强版 (LCT维护最小生成树)

    离线做,把删边转化为加边,那么如果加边的两个点不连通,直接连就行了.如果联通就找他们之间的瓶颈边,判断一下当前边是否更优,如果更优就cut掉瓶颈边,加上当前边. 那怎么维护瓶颈边呢?把边也看做点,向两 ...

  7. 【BZOJ 2594】【WC 2006】水管局长数据加强版

    离线后倒过来做,这样就跟魔法森林差不多了,缩边为点就可以统计边的权值了. 1A真是爽,可惜常数炸上了天,这是滥用stl容器和无脑link,cut的后果 #include<map> #inc ...

  8. BZOJ 2594: [Wc2006]水管局长数据加强版(kruskal + LCT)

    Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...

  9. bzoj 2594 [Wc2006]水管局长数据加强版(LCT+最小生成树)

    [深坑勿入] [给个链接] http://blog.csdn.net/popoqqq/article/details/41348549 #include<cstdio> #include& ...

  10. bzoj 2594: [Wc2006]水管局长数据加强版

    Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...

随机推荐

  1. 安装jdk,tomcat,oracle,PL/SQL的一些问题

    仅限于自己学习使用 新进公司,需要安装jdk1.6,tomcat6, oracle和pl/sql 先是jdk1.6,安装后配置环境变量,都在系统变量里,在cmd,分别打出 java -version, ...

  2. kafka配置内外网同时访问

    #内网监听名称,这个在配置文件中没有需要添加 inter.broker.listener.name=INTERNAL #内网监听规则,第一个是内网,第二个是外网,注意端口不一样,端口可以自己定义 li ...

  3. REST开发(1)

    REST风格 REST简介 Rest(Representational State Transfer),表现形式状态转换(访问网络资源的形式) 传统风格资源描述形式 http://localhost/ ...

  4. QT管理网络状态和网络连接

    参考:http://www.cleartechfei.com/2020/07/qt%E4%BD%BF%E7%94%A8http%E5%8D%8F%E8%AE%AE/ 1. 用Qt框架进行应用开发的过程 ...

  5. Vue案例——todolist

    最近在学习vue,实现todolist案例,实现效果如下: 该案例分为四个部分:header为输入框,body为列表,item是列表中的条目,footer为最下方的统计. 实现步骤: ①创建项目 vu ...

  6. Twig

    {{ dump() }}{{ dump(variable_name) }}List available variables (at top level): {{ dump(_context|keys) ...

  7. 解析bean封装成BeanDefinition

    默认命名空间 1:parseDefaultElement 从代码中可以了解到默认的命名空间的一节节点主要是4种,import,alias,bean,beans private void parseDe ...

  8. 【TensorFlow】InternalError: Failed copying input tensor

    TensorFlow-GPU 执行模型训练时报错: InternalError: Failed copying input tensor from /job:localhost/replica:0/t ...

  9. Beginning IOS 7 Development Exploring the IOS SDK - Navigation Controllers and Table Views

    Note You may notice that the familyNames property is declared using the copy keyword instead of stro ...

  10. shell特殊符号

    符号 含义 ; 命令分隔符 # 配置文件注释:  root用户命令终端提示符 ~ 家目录  cd ~ - 上一次所在路径 cd - su -    linux切换用户环境 ^ 非  [^abcd] $ ...