• 题目简述
  • 做法

题目简述

求1-n的一条路径,路径上所有边的a的最大值和b的最大值相加最小.

做法

首先把边按照 a a a的大小排序,接下来用link_cut_tree维护1→n" role="presentation" style="position: relative;">1→n1→n1\to n的边中 b b b组成的最小生成树.
然后da[u]" role="presentation" style="position: relative;">da[u]da[u]da[u]依然储存边的编号,边权依然拆成点权.
每次按顺序加入每一条边,如果 1 1 1和n" role="presentation" style="position: relative;">nnn连通就算一下当前加入边的 a a a值和1→n" role="presentation" style="position: relative;">1→n1→n1\to n之间最大的 b b <script type="math/tex" id="MathJax-Element-345">b</script>值的和,取一下最小值.

#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{
typedef long long ll;
#define re0 register int
#define rec register char
#define rel register ll
#define gc getchar
#define pc putchar
#define p32 pc(' ')
#define pl puts("")
/*By Citrus*/
inline int read(){int x=0,f=1;char c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');return f?x:-x;}
template <typename mitsuha>
inline bool read(mitsuha &x){x=0;int f=1;char c=gc();for (;!isdigit(c)&&~c;c=gc()) f^=c=='-';if (!~c) return 0;for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');return x=f?x:-x,1;}
template <typename mitsuha>
inline int write(mitsuha x){if (!x) return 0&pc(48);if (x<0) x=-x,pc('-');int bit[20],i,p=0;for (;x;x/=10) bit[++p]=x%10;for (i=p;i;--i) pc(bit[i]+48);return 0;}
inline char fuhao(){char c=gc();for (;isspace(c);c=gc());return c;}
}using namespace chtholly;
using namespace std;
const int yuzu=2e5;
typedef int fuko[yuzu|10];
int n,m;struct edge{
int u,v,a,b;
void rd(){u=read(),v=read(),a=read(),b=read();}
void wt(){printf("%d %d %d %d\n",u,v,a,b);}
bool operator <(const edge &k) const{return a<k.a;}
}e[yuzu|10];struct link_cut_tree{//lct应该不解释.
fuko fa,ch[2],tag,da,val;
#define ls(x) ch[0][x]
#define rs(x) ch[1][x]
#define ws(x,y) (rs(x)==y)
int nrt(int x){return ls(fa[x])==x||rs(fa[x])==x;}
void rev(int x){swap(ls(x),rs(x)),tag[x]^=1;}
void push_down(int x){if (tag[x]) rev(ls(x)),rev(rs(x)),tag[x]=0;}
void push_up(int x){da[x]=val[x];if (e[da[ls(x)]].b>e[da[x]].b) da[x]=da[ls(x)];if (e[da[rs(x)]].b>e[da[x]].b) da[x]=da[rs(x)];}
void pushall(int x){if (nrt(x)) pushall(fa[x]);push_down(x); }
void zhuan(int x){int y=fa[x],z=fa[y],k=ws(y,x),ps=ch[!k][x];if (nrt(y)) ch[ws(z,y)][z]=x;ch[!k][x]=y,ch[k][y]=ps;if (ps) fa[ps]=y;fa[x]=z,fa[y]=x,push_up(y);}
void splay(int x){pushall(x);for (;nrt(x);zhuan(x)){int y=fa[x],z=fa[y];if (nrt(y)) zhuan(ws(y,x)^ws(z,y)?x:y);}push_up(x);}
int access(int x){for (int y=0;x;y=x,x=fa[x]) splay(x),rs(x)=y,push_up(x);}
int mkrt(int x){access(x),splay(x),rev(x);}
void split(int x,int y){mkrt(x),access(y),splay(y);}
int fdrt(int x){access(x),splay(x);for (;ls(x);x=ls(x)) push_down(x);return x;}
int link(int x,int y){mkrt(x);return fdrt(y)^x?fa[x]=y,1:0;}
int cut(int x,int y){mkrt(x);if (fdrt(y)!=x||fa[x]^y||rs(x)) return 0;return fa[x]=ls(y)=0,push_up(y),1;}
}my_;
#define link my_.link
#define cut my_.cut
#define splay my_.splay
#define split my_.split
#define fdrt my_.fdrt
#define da my_.da
#define val my_.valint main(){
int i,j,llx=1e9;
n=read(),m=read();
for (i=1;i<=m;++i) e[i].rd();
sort(e+1,e+m+1);
for (i=n+1;i<=n+m;++i) val[i]=i-n;
for (i=1;i<=m;++i){int u=e[i].u,v=e[i].v,a=e[i].a,b=e[i].b;if (u^v&&fdrt(u)==fdrt(v)){ //这里要判u不等于v,否则会cut(0,n).split(u,v);int id=da[v];if (e[id].b>b) cut(e[id].u,id+n),cut(id+n,e[id].v);//注意维护的是最小生成树,这里必须判e[id].b>b.}//维护最小生成树.link(u,i+n),link(i+n,v);if (fdrt(1)==fdrt(n)) split(1,n),llx=min(llx,a+e[da[n]].b);//1和n连通就加一下.}
printf("%d",llx==1e9?-1:llx);
}

谢谢大家.

洛谷 p2387 [noi2014] 膜fa♂森林 lct维护最小生成树相关推荐

  1. [BZOJ3669] [NOI2004] 魔法森林 LCT维护最小生成树

    题面 一开始看到这道题虽然知道是跟LCT维护最小生成树相关的但是没有可以的去想. 感觉可以先二分一下总的精灵数,但是感觉不太好做. 又感觉可以只二分一种精灵,用最小生成树算另一种精灵,但是和似乎不单调 ...

  2. 【题解】洛谷P2114 [NOI2014]起床困难综合症

    前往:我自己搭建的博客 题目 洛谷P2114 [NOI2014]起床困难综合症 题解 题意简化为:在0~m之间找一个数,使得这个数在一系列操作后最大. 由于原数有大小限制,又要使得到的数尽量大,为了充 ...

  3. 洛谷P2375 [NOI2014] 动物园 题解

    洛谷P2375 [NOI2014] 动物园 题解 题目链接:P2375 [NOI2014] 动物园 题意: 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物 ...

  4. 【洛谷P4719】动态DP【LCT】【矩阵】

    之前的后缀平衡树其实没完,只是过于鬼畜就弃了 传送门 题意:带修改点权的最大独立集 N≤1e5N \leq 1e5N≤1e5 一个没啥用的模板,不过适合练习LCT 先写出方程 f(u,0)=∑v∈so ...

  5. P4172 [WC2006]水管局长 LCT维护最小生成树

    \(\color{#0066ff}{ 题目描述 }\) SC 省 MY 市有着庞大的地下水管网络,嘟嘟是 MY 市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的 ...

  6. YBTOJ洛谷P2387: 魔法森林(LCT)

    解析 LCT从板子到算法的入门题吧 有一些不知道的很实用的技巧 把边按a排序从小到大加入边 那么我们只需要维护当前1-n路径上的b的最小值即可 如果这条边两端点本来不连通,就直接link 否则找到路径 ...

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

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

  8. 洛谷.4234.最小差值生成树(LCT)

    题目链接 先将边排序,这样就可以按从小到大的顺序维护生成树,枚举到一条未连通的边就连上,已连通则(用当前更大的)替换掉路径上最小的边,这样一定不会更差. 每次构成树时更新答案.答案就是当前边减去生成树 ...

  9. 洛谷3613睡觉困难综合征(LCT维护链信息(前后缀)+贪心)

    这个题目还是很好啊QWQ很有纪念意义 首先,如果在序列上且是单次询问的话,就是一个非常裸的贪心了QWQ这也是NOI当时原题的问题和数据范围 我们考虑上树的话,应该怎么做? 我的想法是,对于每一位建一个 ...

最新文章

  1. 蚂蚁金服-支付风险识别亚军方案!
  2. mysql维护索引,mysql 索引优化
  3. 几种软负载均衡策略分析
  4. 3*3卷积核 5*5卷积核到底有多大区别
  5. vba宏语言_三分钟了解Excel的程序语言VBA
  6. cmd 命令行中乱码问题解决
  7. Python Day2
  8. 【Codeforces633H】Fibonacci-ish II
  9. 不规则图形数格子的方法_最强大脑第四季不规则数独规则介绍 数独技巧口诀带图解析...
  10. html闪屏代码,JS闪屏代码,闪瞎你的眼睛
  11. Go语言%d,%p,%v等占位符
  12. windows7启动出现0xc000014c错误代码解决办法
  13. P2615 [NOIP2015 提高组] 神奇的幻方
  14. Python预测2022世界杯1/8决赛胜负
  15. oracle分区维护操作不能与其他,ORA-14048:分区维护操作不能与其它操作组合
  16. Python网络爬虫入门案例
  17. 2021-12-12 WPF面试题 相对于Winform,WPF有什么优势?
  18. 任意设备观看iptv
  19. 设计数据密集型应用 第四章:编码与演化
  20. 浓缩的精华!从零开始带你认识最新的图片格式WEBP

热门文章

  1. HTML实现“流星雨”
  2. 百度地图点击获取定位信息以及定位的经纬度
  3. 关于计算机名的相关讨论 【好帖 好帖 哈哈。。】
  4. jenkins 下载插件失败处理办法
  5. 灵思科电子科技—室内定位技术有哪些_七大室内定位技术详解
  6. 手机的模拟,有耗电和充电方法, 有电量的属性
  7. 小米2s Android pie,Android 9.0 Pie正式版发布,小米MIX 2S率先升级,国内第一款!
  8. python制作壁纸获取器exe,壁纸采集
  9. XTP中CXTPReportControl中合并单元格
  10. draggrid简单用法