luogu2387 [NOI2014]魔法森林
这题和水管局长很像,枚举 \(a\) 的边然后维护关于 \(b\) 的最小生成树就可以了。
1A呐>_<
#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
int n, m, val[150005], zdz[150005], ans=0x3f3f3f3f, fa[150005];
int ch[150005][2], rev[150005];
struct Edge{
int fro, too, vaa, vab;
}edge[100005];
bool cmp(Edge x, Edge y){
return x.vaa<y.vaa;
}
void upd(int x){
zdz[x] = val[x];
if(edge[zdz[ch[x][0]]].vab>edge[zdz[x]].vab)
zdz[x] = zdz[ch[x][0]];
if(edge[zdz[ch[x][1]]].vab>edge[zdz[x]].vab)
zdz[x] = zdz[ch[x][1]];
}
int getw(int x){
return ch[fa[x]][1]==x;
}
bool isroot(int x){
return ch[fa[x]][0]!=x && ch[fa[x]][1]!=x;
}
void pushdown(int x){
if(rev[x]){
swap(ch[x][0], ch[x][1]);
rev[ch[x][0]] ^= 1;
rev[ch[x][1]] ^= 1;
rev[x] = false;
}
}
void xf(int x){
if(fa[x]) xf(fa[x]);
pushdown(x);
}
void rotate(int x){
int old=fa[x], oldf=fa[old], w=getw(x);
if(!isroot(old)) ch[oldf][ch[oldf][1]==old] = x;
ch[old][w] = ch[x][w^1]; ch[x][w^1] = old;
fa[ch[old][w]] = old; fa[ch[x][w^1]] = x; fa[x] = oldf;
upd(old); upd(x);
}
void splay(int x){
xf(x);
while(!isroot(x)){
int f=fa[x];
if(!isroot(f)) rotate(getw(f)==getw(x)?f:x);
rotate(x);
}
upd(x);
}
void access(int x){
int y=0;
while(x){
splay(x);
ch[x][1] = y;
upd(x);
y = x;
x = fa[x];
}
}
void makeroot(int x){
access(x);
splay(x);
rev[x] ^= 1;
}
int findroot(int x){
access(x);
splay(x);
while(ch[x][0])
x = ch[x][0];
splay(x);
return x;
}
void split(int x, int y){
makeroot(x);
access(y);
splay(y);
}
void link(int x, int y){
makeroot(x);
fa[x] = y;
}
void cut(int x, int y){
split(x, y);
fa[x] = ch[y][0] = 0;
}
int main(){
cin>>n>>m;
for(int i=1; i<=m; i++){
scanf("%d %d %d %d", &edge[i].fro, &edge[i].too, &edge[i].vaa, &edge[i].vab);
if(edge[i].fro>edge[i].too) swap(edge[i].fro, edge[i].too);
}
for(int i=n+1; i<=n+m; i++)
val[i] = zdz[i] = i - n;
sort(edge+1, edge+1+m, cmp);
int j=1;
for(int i=1; i<=50000; i++){
for(; j<=m && edge[j].vaa<=i; j++){
int x=edge[j].fro, y=edge[j].too;
if(findroot(x)!=findroot(y)){
link(x, j+n);
link(y, j+n);
}
else{
split(x, y);
int idx=zdz[y];
if(edge[j].vab<edge[idx].vab){
cut(edge[idx].fro, idx+n);
cut(edge[idx].too, idx+n);
link(edge[j].fro, j+n);
link(edge[j].too, j+n);
}
}
}
if(findroot(1)==findroot(n)){
split(1, n);
ans = min(ans, i+edge[zdz[n]].vab);
}
}
if(ans!=0x3f3f3f3f) printf("%d\n", ans);
else printf("%d\n", -1);
return 0;
}
luogu2387 [NOI2014]魔法森林的更多相关文章
- 「luogu2387」[NOI2014] 魔法森林
「luogu2387」[NOI2014] 魔法森林 题目大意 \(n\) 个点 \(m\) 条边的无向图,每条边上有两个权值 \(a,b\),求从 \(1\) 节点到 \(n\) 节点 \(max\{ ...
- 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]魔法森林( LCT )
排序搞掉一维, 然后就用LCT维护加边MST. O(NlogN) ------------------------------------------------------------------- ...
- bzoj 3669: [Noi2014]魔法森林
bzoj 3669: [Noi2014]魔法森林 Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号 ...
- BZOJ_3669_[Noi2014]魔法森林_LCT
BZOJ_3669_[Noi2014]魔法森林_LCT Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节 ...
- bzoj 3669: [Noi2014]魔法森林 (LCT)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3669 题面: 3669: [Noi2014]魔法森林 Time Limit: 30 Sec ...
- P2387 [NOI2014]魔法森林(LCT)
P2387 [NOI2014]魔法森林 LCT边权维护经典题 咋维护呢?边化为点,边权变点权. 本题中我们把边对关键字A进行排序,动态维护关键字B的最小生成树 加边后出现环咋办? splay维护最大边 ...
- [NOI2014]魔法森林 LCT
题面 [NOI2014]魔法森林 题解 一条路径的代价为路径上的\(max(a[i]) + max(b[i])\),因为一条边同时有$a[i], b[i]$2种权值,直接处理不好同时兼顾到,所以我们考 ...
随机推荐
- java线程池系列(1)-ThreadPoolExecutor实现原理
前言 做java开发的,一般都避免不了要面对java线程池技术,像tomcat之类的容器天然就支持多线程. 即使是做偏后端技术,如处理一些消息,执行一些计算任务,也经常需要用到线程池技术. 鉴于线程池 ...
- intelli j中如何重启tomcat,或者关掉tomcat?每次点run都提示jmx端口占用
方法1.idea有时候会这样,我一般都是直接打开任务管理器,把java进程给杀掉就好了.
- 【luogu P3375 KMP字符串匹配】 模板
题目链接:https://www.luogu.org/problemnew/show/P3375 精华:在每次失配后不从头匹配而是尝试找一个新的开始并且是新开始的位置最长的相同前缀和后缀. 实际上KM ...
- EJB JPQL语句查询
JPQL就是一种查询语言,具有与SQL 相类似的特征,JPQL是完全面向对象的,具备继承.多态和关联等特性,和hibernate HQL很相似. 查询语句的参数 JPQL语句支持两种方式的参数定义 ...
- PL/SQL知识点
1.ROW_NUMBER() OVER(PARTITION BY XXX ORDER BY XXX) SELECT STP.FLOW_INST_ID, BUU.USER_NAME, ORGG.NAME ...
- mysql-delete 和 truncate的区别
delete from student where id = 3; -- delete partly delete from student; -- delete all truncate stu ...
- 推荐几个Mac/Linux下比较好用的工具
1.Tmux,连接开发机可以让在任务在开发机一直执行,不用nohup &这种了也相对稳定,还有session可以记录当时的状态. 常用命令: tmux new -s name 指定名字开启一个 ...
- AngularJS表格排序
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- [SDOI2008]仪仗队(欧拉筛裸题)
题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如右图 ...
- HDU 6330--Visual Cube(构造,计算)
Visual Cube 将这个立方体分块,分成上中下三个部分,利用长宽高计算行列,最后输出即可. 每个部分都分成奇偶行来输出,总共有\(2*(b+c)+1\)行,共\(2*(a+b)+1\)列.设当前 ...