bzoj 2594: [Wc2006]水管局长数据加强版
###Description
SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的路径,接着通过信息化的控制中心通知路径上的水管进入准备送水状态,等到路径上每一条水管都准备好了,供水公司就可以开始送水了。嘟嘟一次只能处理一项送水任务,等到当前的送水任务完成了,才能处理下一项。
在处理每项送水任务之前,路径上的水管都要进行一系列的准备操作,如清洗、消毒等等。嘟嘟在控制中心一声令下,这些水管的准备操作同时开始,但由于各条管道的长度、内径不同,进行准备操作需要的时间可能不同。供水公司总是希望嘟嘟能找到这样一条送水路径,路径上的所有管道全都准备就绪所需要的时间尽量短。嘟嘟希望你能帮助他完成这样的一个选择路径的系统,以满足供水公司的要求。另外,由于MY市的水管年代久远,一些水管会不时出现故障导致不能使用,你的程序必须考虑到这一点。
不妨将MY市的水管网络看作一幅简单无向图(即没有自环或重边):水管是图中的边,水管的连接处为图中的结点。
###解题报告
LCT维护最小生成树板子题,思路比较简单
考虑一条边的两端的节点 \(x,y\) ,如果还没有连通,那么直接连边,如果已经连通,就与路径 \((x,y)\) 上最大边比较,如果可以替换掉,那么就断掉最大边,加上当前边即可
另外,维护边权考虑拆边为点,然后就当点权处理即可。这一题是删边,可以考虑把询问反过来建边,注意刚开始的边不能用LCT维护,直接kruskal做一遍即可,加强版卡常
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <map>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=200005,M=2000005;
int gi(){
   int str=0;char ch=getchar();
   while(ch>'9' || ch<'0')ch=getchar();
   while(ch>='0' && ch<='9')str=(str<<1)+(str<<3)+ch-48,ch=getchar();
   return str;
}
int n,m,Q,totnode=0,ans[N];
struct node{int x,y,dis,b,id;}e[M/2],kru[M/2];
struct Question{int flag,x,y;}q[N];
map<int,int>mp[N];
int fa[M],ch[M][2],maxid[M],id[M],par[N];bool rev[M],app[M];
il int find(int x){return par[x]==x?x:par[x]=find(par[x]);}
il bool isrt(int x){return (ch[fa[x]][0]!=x && ch[fa[x]][1]!=x);}
il void upd(int r){
   int ls=ch[r][0],rs=ch[r][1];maxid[r]=id[r];
   if(e[maxid[ls]].dis>e[maxid[r]].dis)maxid[r]=maxid[ls];
   if(e[maxid[rs]].dis>e[maxid[r]].dis)maxid[r]=maxid[rs];
}
il void rotate(RG int r){
   int y=fa[r];bool t=(ch[y][1]==r);
   ch[y][t]=ch[r][!t];
   fa[ch[y][t]]=y;
   ch[r][!t]=y;
   fa[r]=fa[y];
   if(!isrt(y))ch[fa[y]][ch[fa[y]][1]==y]=r;
   fa[y]=r;
   upd(y);upd(r);
}
il void pushdown(RG int r){
   if(!rev[r])return ;
   int ls=ch[r][0],rs=ch[r][1];
   rev[ls]^=1;rev[rs]^=1;
   swap(ch[ls][0],ch[ls][1]);swap(ch[rs][0],ch[rs][1]);
   rev[r]=0;
}
il void Push(RG int r){
   if(!isrt(r) && r)Push(fa[r]);
   pushdown(r);
}
il void splay(RG int r){
   Push(r);
   while(!isrt(r)){
      int y=fa[r],p=fa[y];
      if(isrt(y))rotate(r);
      else if((ch[p][0]==y)==(ch[y][0]==r))rotate(y),rotate(r);
      else rotate(r),rotate(r);
   }
}
il void access(RG int x){
   RG int y=0;
   while(x){
      splay(x);
      ch[x][1]=y;upd(x);
      x=fa[y=x];
   }
}
il void mroot(int x){access(x);splay(x);rev[x]^=1;swap(ch[x][0],ch[x][1]);}
il int query(int x,int y){mroot(x);access(y);splay(y);return e[maxid[y]].dis;}
il void link(int x,int y){mroot(x);fa[x]=y;upd(y);}
il void cut(int x,int y){
   mroot(x);access(y);splay(y);
   fa[x]=ch[y][0]=0;upd(y);
}
il void updata(int x,int y){
   int i=mp[x][y];int b=e[i].b;
   if(find(x)==find(y)){
      mroot(x);access(y);splay(y);
      int j=maxid[y];
      if(e[j].dis<=e[i].dis)return ;
      cut(e[j].x,e[j].b);cut(e[j].y,e[j].b);
      link(b,x);link(y,b);
   }
   else{
      par[find(y)]=find(x);
      link(b,x);link(y,b);
   }
}
il bool comp(const node &i,const node &j){return i.dis<j.dis;}
void work()
{
   scanf("%d%d%d",&n,&m,&Q);totnode=n;
   for(RG int i=1;i<=n;i++)par[i]=i;
   for(RG int i=1;i<=m;i++){
      e[i].x=gi();e[i].y=gi();e[i].dis=gi();e[i].b=++totnode;
      if(e[i].x>e[i].y)swap(e[i].x,e[i].y);
      mp[e[i].x][e[i].y]=i;id[totnode]=i;e[i].id=i;
      kru[i]=e[i];
   }
   for(RG int i=1;i<=Q;i++){
      q[i].flag=gi();q[i].x=gi();q[i].y=gi();
      if(q[i].x>q[i].y)swap(q[i].x,q[i].y);
      if(q[i].flag==2)app[mp[q[i].x][q[i].y]]=true;
   }
   int x,y,totedge=0;
   sort(kru+1,kru+m+1,comp);
   for(RG int i=1;i<=m;i++){
      if(app[kru[i].id])continue;
      x=kru[i].x;y=kru[i].y;
      if(find(x)==find(y))continue;
      totedge++;par[find(y)]=find(x);
      link(kru[i].b,x);link(y,kru[i].b);
      if(totedge==n-1)break;
   }
   for(RG int i=Q;i>=1;i--){
      if(q[i].flag==1)ans[i]=query(q[i].x,q[i].y);
      else updata(q[i].x,q[i].y);
   }
   for(RG int i=1;i<=Q;i++)if(q[i].flag==1)printf("%d\n",ans[i]);
}
int main(){work();return 0;}
												
											bzoj 2594: [Wc2006]水管局长数据加强版的更多相关文章
- bzoj 2594: [Wc2006]水管局长数据加强版 动态树
		
2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 934 Solved: 291[Submit][Sta ...
 - BZOJ 2594: [Wc2006]水管局长数据加强版( LCT )
		
离线然后就是维护加边的动态MST, Link cut tree秒掉..不过我写+调了好久...时间复杂度O(NlogN + MlogM) ------------------------------- ...
 - BZOJ 2594: [Wc2006]水管局长数据加强版 [LCT kruskal]
		
2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 2917 Solved: 918[Submit][St ...
 - 【刷题】BZOJ 2594 [Wc2006]水管局长数据加强版
		
Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...
 - BZOJ 2594: [Wc2006]水管局长数据加强版(kruskal + LCT)
		
Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...
 - [BZOJ 2594] [Wc2006]水管局长数据加强版 【LCT】
		
题目链接:BZOJ - 2594 题目分析 这道题如果没有删边的操作,那么就是 NOIP2013 货车运输,求两点之间的一条路径,使得边权最大的边的边权尽量小. 那么,这条路径就是最小生成树上这两点之 ...
 - BZOJ 2594: [Wc2006]水管局长数据加强版 (LCT维护最小生成树)
		
离线做,把删边转化为加边,那么如果加边的两个点不连通,直接连就行了.如果联通就找他们之间的瓶颈边,判断一下当前边是否更优,如果更优就cut掉瓶颈边,加上当前边. 那怎么维护瓶颈边呢?把边也看做点,向两 ...
 - bzoj 2594 [Wc2006]水管局长数据加强版(LCT+最小生成树)
		
[深坑勿入] [给个链接] http://blog.csdn.net/popoqqq/article/details/41348549 #include<cstdio> #include& ...
 - 2594. [WC2006]水管局长数据加强版【LCT+最小生成树】
		
Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...
 
随机推荐
- 基于微信小程序的失物招领系统的Postmortem
			
基于微信小程序的失物招领系统的Postmortem 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 对于我们团队要解决的问题和实现的功能在项目开始就 ...
 - JAVA对象克隆
			
1> 为了获取对象的一份拷贝,我们可以利用Object类的clone()方法. 2> 在派生类中覆盖基类的clone(),并声明为public.3> 在派生类的clone()方法中, ...
 - python的Virtualenv
			
Virtualenv 虚拟的 Python 环境(简称 venv) 是一个能帮助你在本地目录安装不同版本的 Python 模块的 Python 环境,你可以不再需要在你系统中安装所有东西就能开发并测试 ...
 - 前端面试题之html
			
1.简述<!DOCTYPE> 的作用,标准模式和兼容模式各有什么区别? <!DOCTYPE> 位于文档的第一行,告知浏览器使用哪种规范. 如果不写DOCTYPE,浏览器会进入混 ...
 - 记一次SQL调优/优化(SQL tuning)——性能大幅提升千倍以上
			
好久不写东西了,一直忙于各种杂事儿,恰巧昨天有个用户研发问到我一个SQL调优的问题,说性能太差,希望我能给调优下,最近有些懒,可能和最近太忙有关系,本来打算问问现在的情况,如果差不多就不调了,那哥们儿 ...
 - Web Api 使用模型验证
			
public class Person { public int Id { get; set; } [Required(ErrorMessage = "姓名不能为空啊啊啊!")] ...
 - 使用pie.htc时Border-radius的兼容
			
如果一个图层中(navin)使用了pie.htc来对ie6,7,8进行兼容,如若上一层(navwrap)的样式中有背景的属性,则此层 (navin) 在ie6,7,8中背景颜色不显示.如下图:此部分的 ...
 - Python内置函数(45)——ascii
			
英文文档: ascii(object) As repr(), return a string containing a printable representation of an object, b ...
 - Spring Security 入门(1-6-2)Spring Security - 内置的filter顺序、自定义filter、http元素和对应的filterChain
			
Spring Security 的底层是通过一系列的 Filter 来管理的,每个 Filter 都有其自身的功能,而且各个 Filter 在功能上还有关联关系,所以它们的顺序也是非常重要的. 1.S ...
 - Spring-Boot导入配置文件与取值
			
前言: springboot简化了大量配置文件,但是必要时还是需要导入配置文件的,比如dubbo,此处简记之. 正文: 所有的配置文件引入都是使用注解在类上进行引入的,常用的有两种注解@Propert ...