[Noi2014]魔法森林( 动态mst lct)
以前一直觉得lct特别难写,自从学了丽洁姐的lct之后,觉得lct居然能这么短,这个主程序能40行左右解决~~~~
这道嘛~~虽说能用spfa解决,但还是写下lct吧
把边按a值排序后一条一条插入并维护bmx值就行了= =
不过还是得膜拜云神在考场上a了这道题,我花了好久,自己还是太弱
NOIP就要来了,在这里祝自己RP++吧
毕竟升高二后,每天几乎都是怀着梦想睡觉的
希望这一年能不辜负我的愿望吧
向着最高点,冲吧!!!
CODE:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
#define maxn 101000
struct node{
node *ch[2],*p,*mx;bool rec;int val;
node(int v=0):val(v) {
rec=false;
p=ch[0]=ch[1]=NULL;
mx=this;
}
inline bool d();
inline bool isroot();
inline void update();
inline void relax();
}t[maxn];
inline bool node::d(){return p->ch[1]==this;}
inline bool node::isroot(){
return (p==NULL)||(p->ch[1]!=this&&p->ch[0]!=this);
}
inline void node::relax(){
if (!this) return;
if (!rec) return ;
if (ch[1]) ch[1]->rec^=1;
if (ch[0]) ch[0]->rec^=1;
swap(ch[1],ch[0]);
rec=0;
}
inline void node::update(){
if (!this) return ;
mx=this;
if (ch[0]&&ch[0]->mx->val > mx->val ) mx=ch[0]->mx;
if (ch[1]&&ch[1]->mx->val > mx->val ) mx=ch[1]->mx;
}
inline void rotate(node*u) {
node *v=u->p;
v->relax();u->relax();
bool d=u->d();
if (!v->isroot()) v->p->ch[v->d()]=u;
u->p=v->p;
if (u->ch[d^1]) u->ch[d^1]->p=v;
v->ch[d]=u->ch[d^1];
u->ch[d^1]=v;
v->p=u;
v->update(),u->update();
}
inline void splay(node *u) {
u->relax();
while (!u->isroot()){
if (u->p->isroot()) rotate(u);
else if (u->d()!=u->p->d()) rotate(u),rotate(u);
else rotate(u->p),rotate(u);
}
u->update();
}
inline node* expose(node *u) {
node *v;
for (v=NULL;u;v=u,u=u->p){
splay(u);
u->ch[1]=v;
u->update();
}
return v;
}
inline void evert(node *u) {
expose(u)->rec^=1;
splay(u);
}
inline void link(node *u,node *v) {
evert(u);
u->p=v;
expose(u);
}
inline void cut(node *u,node *v) {
evert(u);
expose(v);
splay(v);
v->ch[0]=u->p=NULL;
v->update();u->update();
}
inline int query(node *u,node *v) {
evert(u);
expose(v);
splay(v);
return v->mx->val;
}
int fa[maxn];
inline int find(int x) {
if (fa[x]!=x) fa[x]=find(fa[x]);
return fa[x];
}
int x[maxn],y[maxn],a[maxn],b[maxn],id[maxn];
bool cmp(int p,int q) {return a[p]<a[q];}
map<node*,int> ma;
int n,m;
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) fa[i]=i;
for (int i=1;i<=m;i++) {
scanf("%d%d%d%d",x+i,y+i,a+i,b+i);
id[i]=i;
}
sort(id+1,id+1+m,cmp);
int ans=0x7fffffff;
for (int i=1;i<=m;i++) {
if (x[id[i]]==y[id[i]]) continue;
node *u=&t[x[id[i]]],*v=&t[y[id[i]]];
if (find(x[id[i]])!=find(y[id[i]])) {
node *e=new node(b[id[i]]);
ma[e]=id[i];
link(u,e);
link (v,e);
fa[find(x[id[i]])]=find(y[id[i]]);
}else {
evert(u);
expose(v);
splay(v);
if (v->mx->val>b[id[i]]){
node *e=v->mx;
splay(e);
node *_u=&t[x[ma[e]]],*_v=&t[y[ma[e]]];
cut(e,_u);
cut(e,_v);
delete e;
e=new node(b[id[i]]);
ma[e]=id[i];
link (u,e);
link (v,e);
}
}
if (find(1)==find(n)) ans=min(ans,a[id[i]]+query(&t[1],&t[n]));
}
if (ans==0x7fffffff) ans=-1;
printf("%d\n",ans);
return 0;
}
[Noi2014]魔法森林( 动态mst lct)的更多相关文章
- bzoj 3669: [Noi2014]魔法森林 动态树
3669: [Noi2014]魔法森林 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 363 Solved: 202[Submit][Status] ...
- BZOJ3669: [Noi2014]魔法森林(瓶颈生成树 LCT)
Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 3558 Solved: 2283[Submit][Status][Discuss] Descript ...
- [bzoj] 3669 NOI2014 魔法森林 || LCT
原题 copy一篇题解:原链接 将边按照a排序,然后从小到大枚举,加入图中. 在图中用lct维护一棵两点之间b最大值尽量小的生成树. 当加入一条边(u, v)时: 如果(u, v)不连通,则直接加入这 ...
- BZOJ 3669 [Noi2014]魔法森林(贪心+LCT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3669 [题目大意] 给出一张图,每条边上有两个值ai和bi,现在需要求出一条1到N的路 ...
- BZOJ 3669: [Noi2014]魔法森林( LCT )
排序搞掉一维, 然后就用LCT维护加边MST. O(NlogN) ------------------------------------------------------------------- ...
- P2387 [NOI2014]魔法森林(LCT)
P2387 [NOI2014]魔法森林 LCT边权维护经典题 咋维护呢?边化为点,边权变点权. 本题中我们把边对关键字A进行排序,动态维护关键字B的最小生成树 加边后出现环咋办? splay维护最大边 ...
- loj2245 [NOI2014]魔法森林 LCT
[NOI2014]魔法森林 链接 loj 思路 a排序,b做动态最小生成树. 把边拆成点就可以了. uoj98.也许lct复杂度写假了..越卡常,越慢 代码 #include <bits/std ...
- bzoj 3669: [Noi2014]魔法森林 (LCT)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3669 题面: 3669: [Noi2014]魔法森林 Time Limit: 30 Sec ...
- [NOI2014]魔法森林 LCT
题面 [NOI2014]魔法森林 题解 一条路径的代价为路径上的\(max(a[i]) + max(b[i])\),因为一条边同时有$a[i], b[i]$2种权值,直接处理不好同时兼顾到,所以我们考 ...
随机推荐
- sqlserver 脚本方式导出数据到excel
use EntDataCenter go SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- =========================== ...
- BootStrap TreeView使用示例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ios数据存储——数据库:SQlite3以及第三方库FMDB
[reference]http://blog.csdn.net/mad1989/article/details/9322307 原生数据库:SQlite3 一.必备条件 在ios项目中使用sqlite ...
- 基于Python,scrapy,redis的分布式爬虫实现框架
原文 http://www.xgezhang.com/python_scrapy_redis_crawler.html 爬虫技术,无论是在学术领域,还是在工程领域,都扮演者非常重要的角色.相比于其他 ...
- 4.ICMP协议,ping和Traceroute
1.IMCP协议介绍 前面讲到了,IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成.其中一个重要的模块就是ICMP(网络控制报文)协议. 当传送 ...
- ZipFile和ZipInputSteam解压zip文件
最近有个需求,要接受上穿的zip文件,解压后读取里面的文件(应该还有目录),提前储备一下需要的知识. 贴在博客上,有需要的可以参考. ZipInputStream解压文件: @Test public ...
- PHP连接和拆分数组array_combine()和array_slice()用法示例
一提起数组,可能很多PHP初学者会觉得难,但开发一些高级应用的时候,又离不开数组的使用.下面就来说下,PHP使用array_combine()函数来连接数组.用array_slice()函数来拆分数组 ...
- 用蓝牙芯片CC2541/CC2540实现一个智能恒温箱
最近突然想自己做一个智能小冰箱玩一玩,于是决定动手试一试. 成品效果图 原材料 半导体制冷片一只 散热风扇 12V电源一台 智能恒温箱电路板 控制板的PCB图 原理图 供电部分原理图 制冷片控制部分原 ...
- Delphi中解析Xml的控件-SimDesign NativeXml
Delphi中解析Xml的控件-SimDesign NativeXml 正在学习,感觉应用很方便.无源代码的版本还是免费的. SimDesign.NativeXml是一个delphi和bcb的XML控 ...
- JQuery操作元素的属性与样式及位置 复制代码
<script type="text/javascript" src="JQuery/jquery-1.5.1.js"></script> ...