题意:求一条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相关推荐

  1. BZOJ 3669: [Noi2014]魔法森林( LCT )

    排序搞掉一维, 然后就用LCT维护加边MST. O(NlogN) ------------------------------------------------------------------- ...

  2. loj2245 [NOI2014]魔法森林 LCT

    [NOI2014]魔法森林 链接 loj 思路 a排序,b做动态最小生成树. 把边拆成点就可以了. uoj98.也许lct复杂度写假了..越卡常,越慢 代码 #include <bits/std ...

  3. [BZOJ]3669: [Noi2014]魔法森林 lct

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  4. [Luogu P2387] [NOI2014]魔法森林 (LCT维护边权)

    题面 传送门:https://www.luogu.org/problemnew/show/P2387 Solution 这题的思想挺好的. 对于这种最大值最小类的问题,很自然的可以想到二分答案.很不幸 ...

  5. [BZOJ3669]-[Noi2014]魔法森林-LCT+并查集

    说在前面 刚刚去写了一道SPFA+网络流的糅合题,1A了 闲着没事干开始翻起了status,发现有人在做水管局长,哇这不是LCT嘛! 然后回头看了一下自己写过的寥寥无几的LCT的题,发现都快要忘了 于 ...

  6. [LCT动态树] [NOI2014]魔法森林,[ZJOI2018]历史

    [NOI2014] 魔法森林 题目 按照aaa精灵从小到大排序 按顺序插入每一条边 加入第iii条边后的最小代价为a[i]a[i]a[i]加上从111到nnn的所有路径中最大bbb最小的路径代价 维护 ...

  7. 【bzoj3669】[Noi2014]魔法森林【LCT】

    [Noi2014]魔法森林 Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1 ...

  8. 神spfa [Noi2014]魔法森林

    问题 G: [Noi2014]魔法森林 时间限制: 30 Sec  内存限制: 512 MB 题目描述 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个 ...

  9. 图论 BZOJ 3669 [Noi2014]魔法森林

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

最新文章

  1. django-celery中配置celery中的日志
  2. Xamarin.FormsShell基础教程(9)Shell相关类体系
  3. 原创:Docker在云家政的应用 谢绝复制粘贴内容
  4. LeetCode-两个结构分别遍历,然后合并
  5. linux下面的时间设置
  6. 【数据结构与算法】之深入解析“打家劫舍III”的求解思路与算法示例
  7. 骑马与砍杀python代码_GitHub - yunwei1237/scottish-fold: 一个关于骑马与砍杀的剧本制作工具...
  8. windows上使用Git bash详细图文教程
  9. Android开发学习之ImageView手势拖拽、缩放、旋转
  10. 国内外优秀音视频博客索引(持续更新)
  11. Atitit zip压缩过滤器 的模块功能语实现attilax总结 1.1. 一般可以使用webserver自带的实现,。如果实现的不好或者不好配置的,或者需要精细化控制的,可以自己使用过滤器实现。
  12. CTF工具-010editor
  13. Android gpuimage美颜滤镜,GPUImage图片美颜
  14. 裸奔系列之博科SAN交换机(3)---SAN交换机初始化
  15. 初探Kronecker product(克罗内克积)
  16. 华为认证HCIA的方向选择
  17. OpenGL ES之GLSL实现多种“马赛克滤镜”效果
  18. 概率图模型(D分离)
  19. Mysql之浅析INSERT ON DUPLICATE
  20. 双系统Linux grub引导,双系统修复ubuntu grub2引导的方法

热门文章

  1. 去掉Nero 8刻录时激活三方专利组件的提示框
  2. WEMOS D1 R1/R2 [ESP8266] + PCA9685 驱动舵机
  3. 视口锁定解锁lisp_CAD锁定和解锁视口的快捷键分别是什么
  4. 如何从ST官网下载官方库函数(更新版)
  5. 谈谈大数据架构下的存储系统
  6. 垃圾回收算法——复制算法 以及eden和survivor
  7. Python回归预测建模实战-随机梯度下降法预测房价(附源码和实现效果)
  8. UML图有哪些类型?
  9. Word插入希腊字母及特殊符号 分类整
  10. PTA乙级 1086 就不告诉你——15分