NOI2014魔法森林--LCT
题意:求一条1->n的路径,使得路径上的MAXA+MAXB最小。
做法:以a值从小到大对边排序,动态加边,维护一个最小生成树就行了。如果两个端点不连通,则直接加上,否则就把这个环上b值最大的边删掉,用LCT维护。
PS:UOJ上居然还有hack单旋的,太坑了。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define REP(I,ST,ED) for(int I=ST,I##end=ED;I<=I##end;++I)
#define DREP(I,ST,ED) for(int I=ST,I##end=ED;I>=I##end;--I)
const int maxn=150005,inf=0x3f3f3f3f;
int read(){int x=0;char c=getchar();while((c<'0')||(c>'9'))c=getchar();while((c>='0')&&(c<='9'))x=x*10+c-'0',c=getchar();return x;
}
void read(int &a,int &b,int &c,int &d){a=read(),b=read(),c=read(),d=read();
}
struct Edge{int u,v,a,b;void input(){read(u,v,a,b);}bool operator < (const Edge &p) const {return a<p.a;}
}E[maxn];
int val[maxn],n,m;
int cmp_val(int x,int y){return val[x]>val[y]?x:y;
}
struct Link_Cut_Tree{int fa[maxn],ch[maxn][2],Max[maxn];bool rev[maxn];bool is_root(int p){return (p!=ch[fa[p]][0])&&(p!=ch[fa[p]][1]);}void push_up(int p){Max[p]=cmp_val(p,cmp_val(Max[ch[p][0]],Max[ch[p][1]]));}void push_down(int p){if(rev[p]){int &u=ch[p][0],&v=ch[p][1];swap(u,v),rev[u]^=1,rev[v]^=1,rev[p]=0;}}void push(int u){if(!is_root(u))push(fa[u]);push_down(u);}void rotate(int u){int p=fa[u],k=(u==ch[p][1]);if(!is_root(p))ch[fa[p]][p==ch[fa[p]][1]]=u;if(ch[u][k^1])fa[ch[u][k^1]]=p;ch[p][k]=ch[u][k^1],ch[u][k^1]=p;fa[u]=fa[p],fa[p]=u,push_up(p);}void splay(int u){push(u);for(int f=fa[u],g=fa[f];!is_root(u);rotate(u),f=fa[u],g=fa[f])if(!is_root(f))rotate(((u==ch[f][1])^(f==ch[g][1]))?u:f);push_up(u);}void access(int u){for(int v=0;u;u=fa[v=u])splay(u),ch[u][1]=v,push_up(u);}void set_root(int u){access(u),splay(u),rev[u]^=1;}void link(int u,int v){set_root(u),fa[u]=v,push_up(v);}void cut(int u,int v){set_root(u),access(v),splay(v);ch[v][0]=fa[u]=0,push_up(v);}int query(int u,int v){set_root(u),access(v),splay(v);return Max[v];}
}T;
int fa[maxn];
int find_fa(int x){if(x==fa[x])return x;else return fa[x]=find_fa(fa[x]);
}
void Add_Edge(int x){T.link(x,E[x].u+m);T.link(x,E[x].v+m);
}
void Del_Edge(int x){T.cut(x,E[x].u+m);T.cut(x,E[x].v+m);
}
int main(){
#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#endifint ans=inf,u,v,Max,tmp;n=read(),m=read();REP(i,1,n)fa[i]=i;REP(i,1,m)E[i].input();sort(E+1,E+1+m);REP(i,1,m){u=E[i].u,v=E[i].v,Max=T.query(u+m,v+m),val[i]=E[i].b;if(find_fa(u)!=find_fa(v))fa[find_fa(v)]=find_fa(u),Add_Edge(i);else if(val[Max]>val[i])Del_Edge(Max),Add_Edge(i);if(find_fa(1)==find_fa(n))ans=min(ans,E[i].a+val[T.query(m+1,m+n)]);}printf("%d\n",ans==inf?-1:ans);return 0;
}
NOI2014魔法森林--LCT相关推荐
- BZOJ 3669: [Noi2014]魔法森林( LCT )
排序搞掉一维, 然后就用LCT维护加边MST. O(NlogN) ------------------------------------------------------------------- ...
- loj2245 [NOI2014]魔法森林 LCT
[NOI2014]魔法森林 链接 loj 思路 a排序,b做动态最小生成树. 把边拆成点就可以了. uoj98.也许lct复杂度写假了..越卡常,越慢 代码 #include <bits/std ...
- [BZOJ]3669: [Noi2014]魔法森林 lct
Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...
- [Luogu P2387] [NOI2014]魔法森林 (LCT维护边权)
题面 传送门:https://www.luogu.org/problemnew/show/P2387 Solution 这题的思想挺好的. 对于这种最大值最小类的问题,很自然的可以想到二分答案.很不幸 ...
- [BZOJ3669]-[Noi2014]魔法森林-LCT+并查集
说在前面 刚刚去写了一道SPFA+网络流的糅合题,1A了 闲着没事干开始翻起了status,发现有人在做水管局长,哇这不是LCT嘛! 然后回头看了一下自己写过的寥寥无几的LCT的题,发现都快要忘了 于 ...
- [LCT动态树] [NOI2014]魔法森林,[ZJOI2018]历史
[NOI2014] 魔法森林 题目 按照aaa精灵从小到大排序 按顺序插入每一条边 加入第iii条边后的最小代价为a[i]a[i]a[i]加上从111到nnn的所有路径中最大bbb最小的路径代价 维护 ...
- 【bzoj3669】[Noi2014]魔法森林【LCT】
[Noi2014]魔法森林 Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1 ...
- 神spfa [Noi2014]魔法森林
问题 G: [Noi2014]魔法森林 时间限制: 30 Sec 内存限制: 512 MB 题目描述 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个 ...
- 图论 BZOJ 3669 [Noi2014]魔法森林
Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...
最新文章
- django-celery中配置celery中的日志
- Xamarin.FormsShell基础教程(9)Shell相关类体系
- 原创:Docker在云家政的应用 谢绝复制粘贴内容
- LeetCode-两个结构分别遍历,然后合并
- linux下面的时间设置
- 【数据结构与算法】之深入解析“打家劫舍III”的求解思路与算法示例
- 骑马与砍杀python代码_GitHub - yunwei1237/scottish-fold: 一个关于骑马与砍杀的剧本制作工具...
- windows上使用Git bash详细图文教程
- Android开发学习之ImageView手势拖拽、缩放、旋转
- 国内外优秀音视频博客索引(持续更新)
- Atitit zip压缩过滤器 的模块功能语实现attilax总结 1.1. 一般可以使用webserver自带的实现,。如果实现的不好或者不好配置的,或者需要精细化控制的,可以自己使用过滤器实现。
- CTF工具-010editor
- Android gpuimage美颜滤镜,GPUImage图片美颜
- 裸奔系列之博科SAN交换机(3)---SAN交换机初始化
- 初探Kronecker product(克罗内克积)
- 华为认证HCIA的方向选择
- OpenGL ES之GLSL实现多种“马赛克滤镜”效果
- 概率图模型(D分离)
- Mysql之浅析INSERT ON DUPLICATE
- 双系统Linux grub引导,双系统修复ubuntu grub2引导的方法