Portal-->bzoj3669

Solution

​   愉悦智力康复ing

​​   这题的话有两个比较关键的地方

​​   首先是答案肯定是原图的某个生成树上的一条路径,那么我们考虑怎么来找这个生成树,因为关键值有两个,所以我们这里可以采取这样的一个方式:先对其中一个关键值排序

​​   我们先将所有的边按照\(a\)值排序,然后按顺序加边,如果说当前这条边连接的两个点已经连通了,那么我们要考虑删掉一条边或者干脆不加这条边

​   这里我们可以用一个贪心的思想,删边的话肯定是删当前的边中\(b\)最大的那个(如果要加的那条边的\(b\)是最大的那么我们就不加这条边),如果说我们加了这条边并且\(1\)和\(n\)连通了,那么可以用当前最大的\(b\)+当前的\(a\)来更新答案(因为\(a\)是升序排列的,所以当前的\(a\)一定是最大的)

​​   接着是第二部分,如何维护\(b\)的最大值?

​​   又要删边又要加边的维护的又是链的数据,那当然是LCT咯qwq,但是因为这个地方我们是要维护边权,所以我们将每一条边变成一个点,然后其他的就全部都是常规操作了ovo

​​   好像是比较套路的一题qwq

​  

​​   代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mp make_pair
#define Pr pair<int,int>
using namespace std;
const int N=50010,M=100010,L=N+M;
const int inf=2147483647;
struct Rec{
int a,b,x,y,id;
friend bool operator <(Rec x,Rec y){return x.a<y.a;}
}a[M];
int n,m,ans;
namespace Lct{/*{{{*/
int ch[L][2],fa[L],mx[L],loc[L],rev[L];
int b[L];
int tot;
bool isroot(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
int which(int x){return ch[fa[x]][1]==x;}
void reverse(int x){
swap(ch[x][0],ch[x][1]);
rev[x]^=1;
}
void pd(int x){
if (rev[x]){
if (ch[x][0]) reverse(ch[x][0]);
if (ch[x][1]) reverse(ch[x][1]);
rev[x]=0;
}
}
void pushdown(int x){
if (!isroot(x)) pushdown(fa[x]);
pd(x);
}
void pushup(int x){
mx[x]=b[x]; loc[x]=x;
if (ch[x][0]){
if (mx[ch[x][0]]>mx[x])
mx[x]=mx[ch[x][0]],loc[x]=loc[ch[x][0]];
}
if (ch[x][1]){
if (mx[ch[x][1]]>mx[x])
mx[x]=mx[ch[x][1]],loc[x]=loc[ch[x][1]];
}
}
void rotate(int x){
int dir=which(x),f=fa[x];
if (!isroot(f)) ch[fa[f]][which(f)]=x;
if (ch[x][dir^1]) fa[ch[x][dir^1]]=f;
fa[x]=fa[f];
ch[f][dir]=ch[x][dir^1];
ch[x][dir^1]=f; fa[f]=x;
pushup(f);
pushup(x);
}
void splay(int x){
pushdown(x);
for (int f=fa[x];!isroot(x);f=fa[x]){
if (!isroot(f))
rotate(which(f)==which(x)?f:x);
rotate(x);
}
}
void access(int x){
for (int last=0;x;last=x,x=fa[x]){
splay(x);
ch[x][1]=last;
pushup(x);
}
}
void make_rt(int x){
access(x);
splay(x);
reverse(x);
}
bool connected(int x,int y){
if (x==y) return true;
make_rt(x);
access(y);
splay(y);
return fa[x];
}
bool check(int x,int y){
make_rt(x);
access(y);
splay(y);
return ch[y][0]==x;
}
void cut(int x,int y){
//printf("Cut %d %d\n",x,y);
make_rt(x);
access(y);
splay(y);
fa[x]=0;
ch[y][0]=0;
pushup(y);
}
Pr query(int x,int y){
make_rt(x);
access(y);
splay(y);
return mp(mx[y],loc[y]);
}
void link(int x,int y){
//printf("Link %d %d\n",x,y);
make_rt(y);
fa[y]=x;
pushup(x);
}
void Link(int x,int y,int bian,int vala){
int tmp;
if (x==y) return;
if (connected(x,y)){
tmp=query(x,y).second;
if (b[bian]<b[tmp]){
cut(a[tmp-n].x,tmp);
cut(a[tmp-n].y,tmp);
link(x,bian);
link(y,bian);
}
}
else{
link(x,bian);
link(y,bian);
}
if (connected(1,n)){
tmp=query(1,n).first;
ans=min(ans,tmp+vala);
}
}
}/*}}}*/
void build(){
sort(a+1,a+1+m);
for (int i=1;i<=m;++i){
a[i].id=i+n;
Lct::b[a[i].id]=a[i].b;
Lct::pushup(a[i].id);
}
}
void solve(){
ans=inf;
int tmp=0;
for (int i=1;i<=m;++i){
Lct::Link(a[i].x,a[i].y,a[i].id,a[i].a);
//printf("%d\n",ans);
}
if (ans!=inf) printf("%d\n",ans);
else printf("-1\n");
} int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
scanf("%d%d",&n,&m);
for (int i=1;i<=m;++i){
scanf("%d%d%d%d\n",&a[i].x,&a[i].y,&a[i].a,&a[i].b);
}
build();
//for (int i=1;i<=m;++i) printf("%d %d %d %d\n",a[i].x,a[i].y,a[i].a,a[i].b);
solve();
}

【bzoj3669】魔法森林的更多相关文章

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

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

  2. [BZOJ3669]魔法森林

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

  3. 洛谷2387 BZOJ3669魔法森林题解

    题目链接 BZ链接 这道题被很多人用spfa水了过去,表示很... 其实spfa很好卡,这组数据可以卡掉大多数spfa 链接:密码:rjvk 这里讲一下LCT的做法 我们按照a将边排序,然后依次添加 ...

  4. 【BZOJ3669】【Noi2014】魔法森林(Link-Cut Tree)

    [BZOJ3669][Noi2014]魔法森林(Link-Cut Tree) 题面 题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n ...

  5. bzoj3669: [Noi2014]魔法森林 lct版

    先上题目 bzoj3669: [Noi2014]魔法森林 这道题首先每一条边都有一个a,b 我们按a从小到大排序 每次将一条路劲入队 当然这道题权在边上 所以我们将边化为点去连接他的两个端点 当然某两 ...

  6. [bzoj3669][Noi2014]魔法森林_LCT_并查集

    魔法森林 bzoj-3669 Noi-2014 题目大意:说不明白题意系列++……题目链接 注释:略. 想法:如果只有1个参量的话spfa.dij什么的都上来了. 两个参量的话我们考虑,想将所有的边按 ...

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

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

  8. BZOJ3669[Noi2014]魔法森林——kruskal+LCT

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

  9. 【NOI2014】【BZOJ3669】【UOJ#3】魔法森林

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

  10. BZOJ3669:[NOI2014]魔法森林——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3669 https://www.luogu.org/problemnew/show/P2387 为了得 ...

随机推荐

  1. 我想这次我真的理解了 JavaScript 的单线程机制

    今天面试的时候被问到一个问题,是关于 JS 异步的.当时我脑海中闪过了一个单线程的概念,但却没有把真正的原理阐述清楚.所以回来特意重新回顾了前面单线程和异步相关的一些知识点. 虽然之前学习的时候也接触 ...

  2. Kubernetes学习-相关概念

    Kubernetes架构图 上图可以看到如下组件,使用特别的图标表示Service和Label: Pod Container(容器) Label()(标签) Replication Controlle ...

  3. JAVA学习笔记--正则表达式

    正则表达式是一种强大而灵活的文本处理工具.使用正则表达式,可以让我们以编程的方式构造复杂的文本,并对输入的字符串进行搜索. 一.基础正则表达式语法(表格来自J2SE6_API) 字符 x 字符 x \ ...

  4. 微软职位内部推荐-Senior Software Engineer II-Sharepoint

    微软近期Open的职位: SharePoint is a multi-billion dollar enterprise business that has grown from an on-prem ...

  5. 曾经我是一个只会excel的数据分析师,直到我遇到了……

    我是一个数据分析师. 准确来说我是一个当年只会excel数据透视表,就天不怕地不怕地来当数据分析师的人.当年的某一天,我的老板Q我: 小刘啊,我小姨子给了我一个全国市委书记的名单,你帮我看看,有什么规 ...

  6. C++:const_cast的简单理解

    前言:const_cast是我比较头疼的一个知识点,最近查阅了很多资料,也翻看了很多他人的博客,故在此将自己目前学习到的有关const_cast知识做一个简单的总结 一.什么是const_cast 简 ...

  7. 进阶系列(8)——匿名方法与lambda表达式

    一 匿名方法的介绍     匿名方法是为了简化委托的实现,方便调用委托方法而出现的,同时,匿名方法也是学好lambda表达式的基础.在委托调用的方法中,如果方法只被调用一次,这个时候我们就没有必要创建 ...

  8. 第二次c艹作业

    1,c语言实现方法:按照电梯运行方式,改变被定义为全局变量的结构体的数值. c艹实现方法:用类来存放电梯的属性,整个过程都是对类操作. 两者不同:c语言是面向过程的,整个函数里都要对电梯的参数进行修改 ...

  9. Jquery获取属性值

    jq获取某个标签内的属性值:$("#TeamPerformanceYearUl li:eq(0)").attr('data') jq获取li或者td第一个属性(索引值从零开始)$( ...

  10. ltnmp 3.0 发布,PHP 开发环境一键安装包

    PHP 开发环境一键安装包, 有个叫lnmp.这个ltnmp看起来更新比较多,开发比较频繁,包括的组件更多. 安装和使用教程:http://www.moqifei.com/ltnmp 标记一下.