[loj2245]魔法森林
枚举携带的"A型守护精灵"数$A_{0}$,那么即只能经过$A_{i}\le A_{0}$的边,并最小化1到$n$路径上最大的$B_{i}$
将所有边按照$A_{i}$从小到大排序,那么前者即不断加入边,后者通过LCT维护$B_{i}$的最小生成树即可
具体的,将每一条边拆成一个点,向对应的两端点连边,加入一条边时查询对应环(若不产生环则直接加入)上$B_{i}$最大的边并替换即可
时间复杂度为$o(m\log m)$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 150005
4 struct Data{
5 int x,y,a,b;
6 bool operator < (const Data &k)const{
7 return a<k.a;
8 }
9 }e[N];
10 multiset<int>S;
11 int n,m,ans,st[N],fa[N],sz[N],rev[N],val[N],mx[N],ch[N][2];
12 int which(int k){
13 return ch[fa[k]][1]==k;
14 }
15 int check(int k){
16 return ch[fa[k]][which(k)]==k;
17 }
18 int get_max(int x,int y){
19 if (e[x].b>e[y].b)return x;
20 return y;
21 }
22 void upd(int k){
23 rev[k]^=1;
24 swap(ch[k][0],ch[k][1]);
25 }
26 void up(int k){
27 sz[k]=sz[ch[k][0]]+sz[ch[k][1]]+1;
28 mx[k]=get_max(get_max(mx[ch[k][0]],mx[ch[k][1]]),val[k]);
29 }
30 void down(int k){
31 if (rev[k]){
32 if (ch[k][0])upd(ch[k][0]);
33 if (ch[k][1])upd(ch[k][1]);
34 rev[k]=0;
35 }
36 }
37 void rotate(int k){
38 int f=fa[k],g=fa[f],p=which(k);
39 fa[k]=g;
40 if (check(f))ch[g][which(f)]=k;
41 fa[ch[k][p^1]]=f,ch[f][p]=ch[k][p^1];
42 fa[f]=k,ch[k][p^1]=f;
43 up(f),up(k);
44 }
45 void splay(int k){
46 for(int i=k;;i=fa[i]){
47 st[++st[0]]=i;
48 if (!check(i))break;
49 }
50 while (st[0])down(st[st[0]--]);
51 for(int i=fa[k];check(k);i=fa[k]){
52 if (check(i)){
53 if (which(i)==which(k))rotate(i);
54 else rotate(k);
55 }
56 rotate(k);
57 }
58 }
59 void access(int k){
60 int lst=0;
61 while (k){
62 splay(k);
63 ch[k][1]=lst,up(k);
64 lst=k,k=fa[k];
65 }
66 }
67 void make_root(int k){
68 access(k);
69 splay(k);
70 upd(k);
71 }
72 int find_root(int k){
73 access(k);
74 splay(k);
75 while (ch[k][0]){
76 down(k);
77 k=ch[k][0];
78 }
79 splay(k);
80 return k;
81 }
82 void add(int x,int y){
83 make_root(x);
84 make_root(y);
85 fa[y]=x;
86 }
87 void del(int x,int y){
88 make_root(x);
89 access(y);
90 splay(x);
91 fa[y]=ch[x][1]=0;
92 up(x);
93 }
94 int query(int x,int y){
95 make_root(x);
96 if (find_root(y)!=x)return -1;
97 return mx[x];
98 }
99 int main(){
100 scanf("%d%d",&n,&m);
101 for(int i=1;i<=m;i++)scanf("%d%d%d%d",&e[i].x,&e[i].y,&e[i].a,&e[i].b);
102 sort(e+1,e+m+1);
103 for(int i=1;i<=m;i++)val[i+n]=mx[i+n]=i;
104 for(int i=1;i<=m;i++)add(e[i].x,i+n);
105 ans=1e9;
106 for(int i=1;i<=m;i++){
107 int s=query(e[i].y,i+n);
108 if (s!=i){
109 if (s>0)del(e[s].y,s+n);
110 add(e[i].y,i+n);
111 }
112 s=query(1,n);
113 if (s>0)ans=min(ans,e[i].a+e[s].b);
114 }
115 if (ans==1e9)ans=-1;
116 printf("%d\n",ans);
117 return 0;
118 }
[loj2245]魔法森林的更多相关文章
- loj2245 [NOI2014]魔法森林 LCT
[NOI2014]魔法森林 链接 loj 思路 a排序,b做动态最小生成树. 把边拆成点就可以了. uoj98.也许lct复杂度写假了..越卡常,越慢 代码 #include <bits/std ...
- 【BZOJ3669】[Noi2014]魔法森林 LCT
终于不是裸的LCT了...然而一开始一眼看上去这是kruskal..不对,题目要求1->n的路径上的每个点的两个最大权值和最小,这样便可以用LCT来维护一个最小生成路(瞎编的...),先以a为关 ...
- BZOJ 3669 【NOI2014】 魔法森林
Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...
- BZOJ-3669 魔法森林 Link-Cut-Tree
意识到背模版的重要性了,记住了原理和操作,然后手打模版残了..颓我时间...... 3669: [Noi2014]魔法森林 Time Limit: 30 Sec Memory Limit: 512 M ...
- 【BZOJ】3669: [Noi2014]魔法森林(lct+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=3669 首先看到题目应该可以得到我们要最小化 min{ max{a(u, v)} + max{b(u, ...
- NOI2014 魔法森林
3669: [Noi2014]魔法森林 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 106 Solved: 62[Submit][Status] ...
- bzoj 3669: [Noi2014]魔法森林 动态树
3669: [Noi2014]魔法森林 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 363 Solved: 202[Submit][Status] ...
- 图论 BZOJ 3669 [Noi2014]魔法森林
Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...
- BZOJ 3669: [Noi2014]魔法森林( LCT )
排序搞掉一维, 然后就用LCT维护加边MST. O(NlogN) ------------------------------------------------------------------- ...
随机推荐
- Java学习路线【转】
Java学习路线[转] 第一阶段:JavaSE(Java基础部分) Java开发前奏 计算机基本原理,Java语言发展简史以及开发环境的搭建,体验Java程序的开发,环境变量的设置,程序的执行过程,相 ...
- 每日总结:String类(2021.10.6)
String创建的字符串存储在公共池中 如: String s1="Runoob": new创建的字符串对象在堆上 如: String s2=new String("Ru ...
- [spring-rabbit]自动配置原理
1 一个简单的示例 在Spring Boot项目中使用spring-rabbit时,需要经过以下几个步骤: 引入依赖. 配置基本连接信息. 创建消息发布者,并发送消息. 创建消息消费者,监听消息并处理 ...
- 海信A6/A6L A7Pro/CC A5PRO/A5PRO CC 安装gms google service指南
用过海信双面屏或者eink手机的朋友都知道,海信手机就是死活安装不了谷歌全家桶,因为海信的领导说跟谷歌有协议不能安装谷歌框架(还说后期google审核坚决不给安装,人家其他ov mui都可以安装).不 ...
- perl合并文件
使用Perl合并文件 有时需要将整个目录下的小文件合并到一个文件中,以便查阅检索 特性 整个目录完全遍历,自动存入单个文件顺序遍历文件 待合并的目录 合并后的文件内容 syscfg/test1 sys ...
- repartition导致的广播失败,关于错误Failed to get broadcast_544_piece0 of broadcast_544
今天一个生产环境任务出现了性能问题,,经过仔细检查发现是在一个join操作时,原设定广播右表数据广播失败,导致后续步骤进行缓慢,,报错信息 java.io.IOException: org.apach ...
- 40个Python入门小程序
有不少同学学完Python后仍然很难将其灵活运用.我整理 37 个Python入门的小程序.在实践中应用Python会有事半功倍的效果. 分享 Github 项目,里面收集了 Python 学习资料 ...
- BUAA 2020 软件工程 提问回顾与个人总结
BUAA 2020 软件工程 提问回顾与个人总结 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾 ...
- createContext 你用对了吗?
目录 前言 性能问题的根源 问题1(整体重复渲染):Provider组件包裹的子组件全部渲染 问题2(局部重复渲染):使用useContext导致组件渲染 解决方案 解决问题1 解决问题2 参考 前言 ...
- 平分的直线 牛客网 程序员面试金典 C++ Python
平分的直线 牛客网 程序员面试金典 C++ Python 题目描述 在二维平面上,有两个正方形,请找出一条直线,能够将这两个正方形对半分.假定正方形的上下两条边与x轴平行. 给定两个vecotrA和B ...