【bzoj2594】 Wc2006—水管局长数据加强版
http://www.lydsy.com/JudgeOnline/problem.php?id=2594 (题目链接)
题意
给出一个带边权的无向简单,要求维护两个操作,删除${u,v}$之间的连边;求${u,v}$之间某条路径使路径上的权值最大边最小。
Solution
我们把询问倒过来做,于是删边就变成了加边,然后就可以LCT啦。
mdzz卡了一上午常数,下面讲一讲我卡常数的心得→_→:
1.pushdown写成非递归的
2.初始连边时一定要写克鲁斯卡尔,而不是直接LCT维护删边加边
3.find函数用并查集写
4.不要用STL的stack。。。
5.inline加上
6.读入优化
7.因为保证任何时刻图连通,所以我们对询问进行操作时,加入的边的两个端点一定在同一连通块内,于是省去了2次find→_→
代码
- // bzoj2594
- #include<algorithm>
- #include<iostream>
- #include<cstdlib>
- #include<cstring>
- #include<cstdio>
- #include<cmath>
- #include<ctime>
- #define LL long long
- #define inf (1ll<<30)
- #define Pi acos(-1.0)
- #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
- using namespace std;
- inline int gi() {
- int x=0,f=1;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;
- }
- const int maxn=100010,maxm=1100010;
- int a[maxm],mx[maxm],fa[maxm],tr[maxm][2],rev[maxm],ans[maxn],vis[maxm];
- int n,m,Q,f[maxm],st[maxm];
- struct ask {int k,x,y,id;}q[maxn];
- struct edge {int u,v,w,id;}e[maxm];
- inline bool cmp1(edge a,edge b) {return a.u==b.u ? a.v<b.v : a.u<b.u;}
- inline bool cmp2(edge a,edge b) {return a.w<b.w;}
- inline bool cmp3(edge a,edge b) {return a.id<b.id;}
- inline void pushup(int x) {
- if (a[mx[tr[x][0]]]>a[mx[tr[x][1]]]) mx[x]=mx[tr[x][0]];
- else mx[x]=mx[tr[x][1]];
- if (a[x]>a[mx[x]]) mx[x]=x;
- }
- inline void pushdown(int x) {
- st[0]=0;
- while (tr[fa[x]][0]==x || tr[fa[x]][1]==x) st[++st[0]]=x,x=fa[x];
- st[++st[0]]=x;
- for (int i=st[0];i>=1;i--) {
- x=st[i];
- if (rev[x]) {
- swap(tr[x][0],tr[x][1]);
- rev[tr[x][0]]^=1;rev[tr[x][1]]^=1;rev[x]^=1;
- }
- }
- }
- inline void rotate(int x) {
- int y=fa[x],z=fa[y],l,r;
- l=tr[y][1]==x;r=l^1;
- if (tr[z][0]==y || tr[z][1]==y) tr[z][tr[z][1]==y]=x;
- fa[x]=z;fa[y]=x;fa[tr[x][r]]=y;
- tr[y][l]=tr[x][r];tr[x][r]=y;
- pushup(y);pushup(x);
- }
- inline void splay(int x) {
- pushdown(x);
- while (tr[fa[x]][0]==x || tr[fa[x]][1]==x) {
- int y=fa[x],z=fa[y];
- if (tr[z][0]==y || tr[z][1]==y) {
- if (tr[z][0]==y ^ tr[y][0]==x) rotate(x);
- else rotate(y);
- }
- rotate(x);
- }
- }
- inline void access(int x) {
- for (int y=0;x;y=x,x=fa[x])
- splay(x),tr[x][1]=y,pushup(x);
- }
- inline void makeroot(int x) {
- access(x);splay(x);rev[x]^=1;
- }
- inline void link(int x,int y) {
- makeroot(x);fa[x]=y;
- }
- inline void cut(int x,int y) {
- makeroot(x);access(y);splay(y);
- tr[y][0]=fa[x]=0;pushup(y);
- }
- inline int query(int x,int y) {
- makeroot(x);access(y);splay(y);
- return mx[y];
- }
- inline int find(int x) {
- return f[x]==x ? x : f[x]=find(f[x]);
- }
- inline int Lower_bound(int x,int y) {
- int l=1,r=m,res;
- while (l<=r) {
- int mid=(l+r)>>1;
- if (x<e[mid].u || (x==e[mid].u && y<=e[mid].v)) res=mid,r=mid-1;
- else l=mid+1;
- }
- return e[res].id;
- }
- int main() {
- n=gi(),m=gi(),Q=gi();
- for (int i=1;i<=m;i++) {
- e[i].u=gi(),e[i].v=gi(),e[i].w=gi(),e[i].id=i;
- if (e[i].u>e[i].v) swap(e[i].u,e[i].v);
- }
- sort(e+1,e+1+m,cmp1);
- for (int i=1;i<=Q;i++) {
- q[i].k=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].k==2) q[i].id=Lower_bound(q[i].x,q[i].y),vis[q[i].id]=1;
- }
- sort(e+1,e+1+m,cmp2);
- for (int i=1;i<=n+m;i++) a[i]=0,f[i]=i;
- for (int i=1;i<=m;i++) if (!vis[e[i].id]) {
- a[n+e[i].id]=e[i].w;
- int r1=find(e[i].u),r2=find(e[i].v);
- if (r1!=r2) {
- link(e[i].u,n+e[i].id),link(e[i].v,n+e[i].id);
- f[r1]=r2;
- }
- }
- sort(e+1,e+1+m,cmp3);
- for (int i=Q;i>=1;i--) {
- if (q[i].k==1) ans[i]=a[query(q[i].x,q[i].y)];
- else {
- int t=q[i].id;
- a[t+n]=e[t].w;
- int xx=query(e[t].u,e[t].v);
- if (a[xx]<=a[n+t]) continue;
- cut(e[xx-n].u,xx),cut(e[xx-n].v,xx);
- link(e[t].u,n+t),link(e[t].v,n+t);
- }
- }
- for (int i=1;i<=Q;i++) if (q[i].k==1) printf("%d\n",ans[i]);
- return 0;
- }
【bzoj2594】 Wc2006—水管局长数据加强版的更多相关文章
- BZOJ2594: [Wc2006]水管局长数据加强版
题解: 裸LCT+离线+二分+MST... 代码:(几乎摘抄自hzwer) #include<cstdio> #include<cstdlib> #include<cma ...
- [bzoj2594][Wc2006]水管局长数据加强版 (lct)
论蒟蒻的自我修养T_T.. 和noi2014魔法森林基本一样...然而数据范围大得sxbk...UPD:这题如果用lct判联通的话可能会被卡到O(mlogm)..所以最好还是用并查集吧 一开始数组开太 ...
- BZOJ2594 [Wc2006]水管局长数据加强版 【LCT维护最小生成树】
题目 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的 ...
- BZOJ2594 [Wc2006]水管局长数据加强版 LCT kruskal
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2594 题意概括 N个点的图,M条带权边.(N<=100000,M<=1000000) ...
- [BZOJ2594] [Wc2006]水管局长数据加强版(LCT + kruskal + 离线)
传送门 WC这个题真是丧心病狂啊,就是想学习一下怎么处理边权,给我来了这么一个破题! ORZ hzwer 临摹黄学长代码233 但还是复杂的一匹 理一下思路吧 题目大意:给定一个无向图,多次删除图中的 ...
- 沉迷Link-Cut tree无法自拔之:[BZOJ2594][Wc2006]水管局长数据加强版
来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 这应该算是道套路题吧, 如果将图中的边转换成点, 再将边权变点权, 就可以用 \(LCT\) 来维护了 ...
- [bzoj2594][Wc2006]水管局长数据加强版——lct+离线
Brief Description 您有一个无向带权图,您需要支持两种操作. 询问两个点之间的最大权最小路径. 删除一条边. Algorithm Design 我们首先提出一个猜想:最优路径一定在原图 ...
- bzoj2594 [Wc2006]水管局长数据加强版——LCT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2594 时间倒序一下,就是 魔法森林 那道题: 有个不解的地方,是 access 里面关于 p ...
- 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) ------------------------------- ...
随机推荐
- bootstrap switch样式修改与多列等间距布局
先以一张图开启今天的随笔 今天实习遇到了switch按钮,小姐姐说用插件bootstrap switch来写,我第一次用这个插件,首先在引入方面就遇到了很多坑,先来总结一下bootstrap swit ...
- 回顾下TCP/IP协议
首先要知道什么是TCP/IP协议,从字面意思来看TCP是“Transmission Control Protocol”的缩写,也就是传输控制协议.IP是“Internet Protocol”的缩写,即 ...
- 【转载】pycharm常用快捷键
来源: (https://blog.csdn.net/weixin_41059146/article/details/78826163) 1.编辑(Editing) Ctrl + Space 基 ...
- XSS工具
1.BEEF KALI中启动BEEFXSS PAYLOAD为 <script src=”http://攻击机IP:3000/hook.js”></script> 将攻击代码插入 ...
- sprint2(第四天)
由于最近网络不行,更新的代码push不上Github,组员之间又不能clone得到最新的项目,所以这几天都没有更新到Github 燃尽图
- HTML基础学习总结
一.HTML的一些基本描述 全称:Hyper Text Markup Language 定义:超文本标记语言,是标记语言而不是编程语言,使用标记标签来描述网页,所以也被称为网页 格式:标签对里面放纯文 ...
- POJ 2411 Mondriaan's Dream 插头dp
题目链接: http://poj.org/problem?id=2411 Mondriaan's Dream Time Limit: 3000MSMemory Limit: 65536K 问题描述 S ...
- C#代码分析(第三周)
阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间 ...
- 团队作业7——第二次项目冲刺(Beta版本12.07——12.08)
1.当天站立式会议照片 本次会议在5号公寓3楼召开,本次会议内容:①:熟悉每个人想做的模块.②:根据项目要求还没做的完成. 2.每个人的工作 经过会议讨论后确定了每个人的分工 组员 任务 陈福鹏 实现 ...
- HDU 2086 A1 = ?
http://acm.hdu.edu.cn/showproblem.php?pid=2086 Problem Description 有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci ( ...