枚举携带的"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]魔法森林的更多相关文章

  1. loj2245 [NOI2014]魔法森林 LCT

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

  2. 【BZOJ3669】[Noi2014]魔法森林 LCT

    终于不是裸的LCT了...然而一开始一眼看上去这是kruskal..不对,题目要求1->n的路径上的每个点的两个最大权值和最小,这样便可以用LCT来维护一个最小生成路(瞎编的...),先以a为关 ...

  3. BZOJ 3669 【NOI2014】 魔法森林

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

  4. BZOJ-3669 魔法森林 Link-Cut-Tree

    意识到背模版的重要性了,记住了原理和操作,然后手打模版残了..颓我时间...... 3669: [Noi2014]魔法森林 Time Limit: 30 Sec Memory Limit: 512 M ...

  5. 【BZOJ】3669: [Noi2014]魔法森林(lct+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3669 首先看到题目应该可以得到我们要最小化 min{ max{a(u, v)} + max{b(u, ...

  6. NOI2014 魔法森林

    3669: [Noi2014]魔法森林 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 106  Solved: 62[Submit][Status] ...

  7. bzoj 3669: [Noi2014]魔法森林 动态树

    3669: [Noi2014]魔法森林 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 363  Solved: 202[Submit][Status] ...

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

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

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

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

随机推荐

  1. 聊聊我对 GraphQL 的一些认知

    每隔一段时间就能看到一篇 GraphQL 的文章,但是打开文章一看,基本上就是简单的介绍下 GraphQL 的特性.很多文章其实就是 github 上找个 GraphQL 的项目,然后按照对应的 de ...

  2. NOIP&CSP 考前 Dev-cpp 的选项问题和考试心态

    (进入考场后您将获得一个崭新的 \(Dev-cpp\),没有中文,没有编译选项,没有缺省源:我还将获得一个崭新的脑子,没有心态,没有智商,没有调试能力--) 中文 \[Step1 \] \[Step2 ...

  3. C++ IDE或编辑器安装

    IDE介绍 上节课我们讲了C++编译器,可是没有好的编辑器,只用记事本打代码,这谁受得了.Linux vim至少还有代码高亮(即我作文里经常会出现的"彩色的代码"),记事本连高亮都 ...

  4. 高效动画实现原理-Jetpack Compose 初探索

    一.简介 Jetpack Compose是Google推出的用于构建原生界面的新Android 工具包,它可简化并加快 Android上的界面开发.Jetpack Compose是一个声明式的UI框架 ...

  5. win10安装git fatal: open /dev/null or dup failed: No such file or directory错误解决方法

    原因看大家意思应该是 非即插即用驱动文件null.sys问题. 网上有很多方案.最后试了一个可行的. 替换  windows/system32/drivers/null.sys为网盘中的文件即可. 链 ...

  6. 如何再一台电脑上配置多个tomcat同时运行

    1.配置运行tomcat 首先要配置java的jdk环境,这个就不在谢了  不懂去网上查查,这里主要介绍再jdk环境没配置好的情况下 如何配置运行多个tomcat 2.第一个tomcat: 找到&qu ...

  7. 第四次Scrum Metting

    日期:2021年4月29日 会议主要内容概述:交代近两日工作,进一步细化上次讨论细节,代码合并. 一.进度情况## 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 ...

  8. [对对子队]会议记录4.19(Scrum Meeting10)

    今天已完成的工作 何瑞 ​ 工作内容:搭建第2关,基本完成第3关 ​ 相关issue:搭建关卡2.3 ​ 相关签入:4.19签入1 4.19签入2 刘子航 ​ 工作内容:完成关卡选择界面的设计图 ​ ...

  9. BUAA 软工 | 从计算机技术中探索艺术之路

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! 我在这个课程的目标是 掌握软件开发方法学和工程学知识 这个作业在哪个具体方面帮 ...

  10. 简明教程 | Docker篇 · 其二:Dockerfile的编写

    Dockerfile是什么 一个包含用于组合 image 的命令的文本文件,docker 通过 dockerfile 和构建环境的上下文来构建 image . 编写Dockerfile FROM 首先 ...