原题链接

前言

搞不懂为什么要写LCT,搞不懂为什么要加强数据。像这道题是用父亲表示法来做的。虽然复杂度不是log,但是现在下面这份代码却是无论从空间,还是代码量,还是时间都是优秀不止一点。 而且这样还能出在noip这样的考试


sol

一个烂大街的套路就是离线搞。这也是这道题的唯一难点。估计大佬们都已经讲透了。

但是为了照顾我这样的不会LCT的蒟蒻,这里有一个更好的办法,那就是直接用fa[]数组来维系这棵树。比如说,要把u,v相连,首先把u向上用fa数组跑,然后一路将fa数组反向。

然后就可以直接赋值fa[u]=v。

但是写的时候还是心虚,所以写的十分小心,应该把常数弄到最小了。代码一定不能写丑

code

#include<bits/stdc++.h>
using namespace std;
const int _=1e6+;
int fa[],g[][],n,m,Q,anss[_/],mm,par[],sign[],cnt;
int rec[];
struct Edge{
int u,v,w;
}e[_],e1[_];
struct MO{
int u,v,k;
}mo[_];
inline char gc(){
static char buf[<<],*p1=buf,*p2=buf;
return (p1==p2)&&(p2=(p1=buf)+fread(buf,,<<,stdin),p1==p2)?EOF:*p1++;
}
template <class T>
inline void read(T&data){
data=;
register char ch=;
while(ch<''||ch>'')ch=gc();
while(ch<=''&&ch>=''){
data=(data<<)+(data<<)+(ch^);
ch=gc();
}
}
template <class R>
inline void write(R data){
if(data>)write(data/);
putchar(''+data%);
}
bool cmp(register Edge a,register Edge b){return a.w<b.w;}
int fi(register int x){return x==par[x]?x:par[x]=fi(par[x]);}
int main(){
read(n),read(m),read(Q);
register int i,u,v,fu,fv,ff,qq,now,LCA,ans,ANS;
for(i=;i<=m;++i){
register Edge & fff=e1[i];
read(fff.u),read(fff.v),read(fff.w);
}
for(i=;i<=Q;++i){
register MO& IOI=mo[i];
read(IOI.k),read(IOI.u),read(IOI.v);
if(IOI.k==)g[IOI.v][IOI.u]=,g[IOI.u][IOI.v]=;
}
for(i=;i<=m;++i){
register int &IOI=g[e1[i].u][e1[i].v];
if(!IOI)e[++mm]=e1[i];
IOI=g[e1[i].v][e1[i].u]=e1[i].w;
}
sort(e+,e+mm+,cmp);
for(i=;i<=n;++i)par[i]=i;
for(i=;i<=mm;++i){
u=e[i].u,v=e[i].v,fu=fi(u),fv=fi(v);
if(fu==fv)continue;
par[fu]=fv,ff=fa[u],qq=u;
while(ff)
swap(fa[ff],qq),swap(ff,qq);
fa[u]=v;
}
for(i=Q;i;--i){
u = mo[i].u,v=mo[i].v,now=u,rec[now]=;
while(now){sign[now]=i,rec[fa[now]]=max(rec[now],g[now][fa[now]]),now=fa[now];}
LCA=v,ans=,ANS=;
while(LCA&&sign[LCA]!=i){ans=max(ans,g[LCA][fa[LCA]]),LCA=fa[LCA];}
ANS=max(ans,rec[LCA]);
if(mo[i].k==){anss[++cnt]=ANS;}
else {
if(ANS<=g[u][v])continue;
if(ans>rec[LCA])swap(u,v);
ff=fa[u],qq=u;
while(g[qq][ff]!=ANS){
swap(fa[ff],qq),swap(ff,qq);
}
fa[u]=v;
} }
for(i=cnt;i;--i)write(anss[i]),puts("");
return ;
}

[WC2006]水管局长的更多相关文章

  1. BZOJ2594: [Wc2006]水管局长数据加强版

    题解: 裸LCT+离线+二分+MST... 代码:(几乎摘抄自hzwer) #include<cstdio> #include<cstdlib> #include<cma ...

  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. [bzoj2594][Wc2006]水管局长数据加强版 (lct)

    论蒟蒻的自我修养T_T.. 和noi2014魔法森林基本一样...然而数据范围大得sxbk...UPD:这题如果用lct判联通的话可能会被卡到O(mlogm)..所以最好还是用并查集吧 一开始数组开太 ...

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

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

  6. BZOJ_2594_[Wc2006]水管局长数据加强版_LCT

    BZOJ_2594_[Wc2006]水管局长数据加强版_LCT Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供 ...

  7. P4172 [WC2006]水管局长(LCT)

    P4172 [WC2006]水管局长 LCT维护最小生成树,边权化点权.类似 P2387 [NOI2014]魔法森林(LCT) 离线存储询问,倒序处理,删边改加边. #include<iostr ...

  8. P4172 [WC2006]水管局长

    P4172 [WC2006]水管局长 前言 luogu数据太小 去bzoj,他的数据大一些 思路 正着删不好维护 那就倒着加,没了 LCT维护他的最小生成树MST 树上加一条边肯定会有一个环 看看环上 ...

  9. [BZOJ2594][WC2006]水管局长加强版(LCT+Kruskal)

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

  10. [BZOJ2594] [WC2006]水管局长(Kruskal+LCT)

    [BZOJ2594] [WC2006]水管局长(Kruskal+LCT) 题面 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可 ...

随机推荐

  1. python 生成器(generator)的生成方式

    generator包括生成器和带yield的generator函数. 写了一个生成杨辉三角的小例子: # -*- coding:utf-8 -*- def triangles(): l = [1] w ...

  2. code-Behind 技术

    就是代码隐藏,在ASP.NET 中通过ASPX 页面指向CS 文件的方法实现显示逻辑和处理逻辑的分离,这样有助于web 应用程序的创建.比如分工,美工和编程的可以个干各的,不用再像以前asp 那样都代 ...

  3. Excel 使用单元格的值 查询MySQL数据库并返回数据给相应的单元格

    Dim MyConn As ObjectPrivate Sub ConnectDB()Set MyConn = CreateObject("ADODB.Connection")   ...

  4. RabbitMQ 的安装----Linux环境

    CentOS7  安装RabbitMq 参考------>  https://www.cnblogs.com/liaojie970/p/6138278.html https://www.cnbl ...

  5. 为什么使用zookeeper?

    随着应用规模的迅速扩张,单台机器的部署已经难以支撑用户大规模.高并发的请求了, 因此服务化.集群化.分布式概念应运而生. 针对这种场景,人们通常使用的做法就是将软件按照模块进行拆分,形成独立的子系统, ...

  6. vue的$nextTick使用总结,this.$refs为undefined的解决办法,element Ui的树形控件setCheckedKeys方法无法使用

    其实这3个讲的是一个问题,先说下问题,我在watch里设置一个监听,当弹窗打开时,自动添加树形的默认选中项, 但奇怪的是this.$refs为undefined,自然setCheckedKeys无法使 ...

  7. linux 增加虚拟内存swap(使用文件)

    1.简介 如果你的服务器的总是报告内存不足,并且时常因为内存不足而引发服务被强制kill的话,在不增加物理内存的情况下,启用swap交换区作为虚拟内存是一个不错的选择. 为了测试一些功能我在阿里云购买 ...

  8. SQL Server用表组织数据

    一.主键 主键作为表中的唯一标识,标识这一列不允许出现重复数据    如果两列或多列组合起来唯一标识表中的每一行,该主键叫“复合主键” 选择主键的原则     最少性      尽量选择单个键作为主键 ...

  9. 加#include <mysql.h>,报了很多以下错误

    1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(557): warning C4005: “FD ...

  10. 测试工具安装(JMeter,Postman)

    Jmeter的安装依赖Java环境,所以必须安装JDK(1.8版本以上的),与JRE集成安装.记得配置环境变量.(5H) Postman,我安装的windows64的,直接在官网下载就好了.不需要在c ...