以前一直觉得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)的更多相关文章

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

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

  2. BZOJ3669: [Noi2014]魔法森林(瓶颈生成树 LCT)

    Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 3558  Solved: 2283[Submit][Status][Discuss] Descript ...

  3. [bzoj] 3669 NOI2014 魔法森林 || LCT

    原题 copy一篇题解:原链接 将边按照a排序,然后从小到大枚举,加入图中. 在图中用lct维护一棵两点之间b最大值尽量小的生成树. 当加入一条边(u, v)时: 如果(u, v)不连通,则直接加入这 ...

  4. BZOJ 3669 [Noi2014]魔法森林(贪心+LCT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3669 [题目大意] 给出一张图,每条边上有两个值ai和bi,现在需要求出一条1到N的路 ...

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

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

  6. P2387 [NOI2014]魔法森林(LCT)

    P2387 [NOI2014]魔法森林 LCT边权维护经典题 咋维护呢?边化为点,边权变点权. 本题中我们把边对关键字A进行排序,动态维护关键字B的最小生成树 加边后出现环咋办? splay维护最大边 ...

  7. loj2245 [NOI2014]魔法森林 LCT

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

  8. bzoj 3669: [Noi2014]魔法森林 (LCT)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3669 题面: 3669: [Noi2014]魔法森林 Time Limit: 30 Sec  ...

  9. [NOI2014]魔法森林 LCT

    题面 [NOI2014]魔法森林 题解 一条路径的代价为路径上的\(max(a[i]) + max(b[i])\),因为一条边同时有$a[i], b[i]$2种权值,直接处理不好同时兼顾到,所以我们考 ...

随机推荐

  1. RoundedImageView使用吐槽心得(RoundedImageView与Glide加载图片,第一次加载无法圆角问题)

    最近使用的时候发现一个问题, RoundedImageView与Glide搭配使用的时候,第一次加载图片(内存中没有),后图片无法圆角,后来尝试各种改,最后想到了一个办法,就是让Glide加载图片的 ...

  2. 匿名函数里的this的执行环境和指向--javascript

    重新看了下闭包,在javascript高级程序设计第二版里的闭包里有如下例子,例子中介绍说匿名函数的执行环境具有全局性和this指向window,对于这句话很费解,所以就想个方法验证下. var na ...

  3. Python3基础 用 函数递归求解 一个数字的阶乘

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  4. CocoaPods ReactiveCocoa 学习实践一 之 配置环境

    1.安装CocoaPods 1.00.参考 CocoaPods 文档 1.01.是否已安装 which pod 1.1.升级gem命令 sudo gem update --system 1.2.切换C ...

  5. HOJ 1003 Max Sum 解题报告

    好几年没有做ACM了,感觉忘得差不多了,这个做着做着就打瞌睡了!言归正传,下面是我的解题思路: 首先的话,我们可以画一个函数图,以输入数组的下标为X轴,以数组的和为Y轴,当数组和小于零时,我们使用备用 ...

  6. ubuntu系统中crontab的使用介绍

    1.创建crontab任务 用户hancool

  7. 9 Python+Selenium鼠标事件

    [环境信息] python3.6+Selenium3.0.2+Firefox50.0+win7 [ActionChains类鼠标事件的常用方法] 1.右击:context_click() 2.双击:d ...

  8. 如何迅速成为Java高手

    很多网友朋友问我学习Java有没有什么捷径,我说“没有,绝对没有!”.但是我却很愿意将自己学习的一些经验写出来,以便后来者少走弯路,帮助别人是最大的快乐嘛!         要想学好Java,首先要知 ...

  9. 3.3. 轻量级的迁移方式(Core Data 应用程序实践指南)

    持久化存储协调器会试着用新版的模板打开原来的持久化存储区,但是那是旧的模板,旧的格式,当然会出错.现在要做的就是迁移现有的持久化数据区,以便跟新模型匹配. 怎么进行迁移呢? 在什么时候进行迁移? 在向 ...

  10. java 数据设置和显示

    1. 首先设置ModelAndView 的值 @Override public ModelAndView handleRequest(HttpServletRequest arg0, HttpServ ...