$LCT+枚举$ 复习一下$LCT$模板。

先以$Ai$为关键字$sort$,然后$Ai$从小到大枚举每条边,看能否构成环,构不成则加边,构成则判断,判断过了就切断$Bi$最大的边。

我的边是编号为$i+n$的点,忘了这点调了好久$QAQ$ $sosad$

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 150003
#define read(x) x=getint()
using namespace std;
inline int getint() {int k = 0, fh = 1; char c = getchar(); for(; c < '0' || c > '9'; c = getchar()) if (c == '-') fh = -1; for(; c >= '0' && c <= '9'; c = getchar()) k = k * 10 + c - '0'; return k * fh;}
struct nodeE {int a, b, x, y;} E[N];
struct node *null;
struct node {
node *ch[2], *fa;
int d, pos;
short rev;
bool pl() {return fa->ch[1] == this;}
bool check() {return fa == null || (fa->ch[0] != this && fa->ch[1] != this);}
void push() {if (rev) {rev = 0; swap(ch[0], ch[1]); ch[0]->rev ^= 1; ch[1]->rev ^= 1;}}
void count() {
pos = d;
if (E[ch[0]->pos].b > E[pos].b) pos = ch[0]->pos;
if (E[ch[1]->pos].b > E[pos].b) pos = ch[1]->pos;
}
void setc(node *r, bool c) {ch[c] = r; r->fa = this;}
} *rt[N];
node pool[N];
int n, m, tot = 0;
namespace LCT {
int ans = 0x7fffffff;
bool cmp(nodeE X, nodeE Y) {return X.a < Y.a;}
node *newnode(int num = 0) {
node *t = &pool[++tot];
t->ch[0] = t->ch[1] = t->fa = null;
t->d = t->pos = num; t->rev = 0;
return t;
}
void Build() {
null = &pool[0];
null->ch[0] = null->ch[1] = null->fa = null;
null->d = null->pos = null->rev = 0;
read(n); read(m);
for(int i = 1; i <= m; ++i)
{read(E[i].x); read(E[i].y); read(E[i].a); read(E[i].b);}
sort(E + 1, E + m + 1, cmp);
for(int i = 1; i <= n; ++i)
rt[i] = newnode();
for(int i = 1; i <= m; ++i)
rt[n + i] = newnode(i);
E[0].b = 0;
}
void rotate(node *r) {
node *f = r->fa;
bool c = r->pl();
if (f->check()) r->fa = f->fa;
else f->fa->setc(r, f->pl());
f->setc(r->ch[!c], c);
r->setc(f, !c);
f->count();
}
void update(node *r) {if (!r->check()) update(r->fa); r->push();}
void splay(node *r) {
update(r);
for(; !r->check(); rotate(r))
if (!r->fa->check()) rotate(r->pl() == r->fa->pl() ? r->fa : r);
r->count();
}
node *access(node *r) {node *y = null; for(; r != null; y = r, r = r->fa) {splay(r); r->ch[1] = y;} return y;}
void changert(node *r) {access(r)->rev ^= 1; splay(r);}
void link(node *r, node *t) {changert(r); r->fa = t;}
void cut(node *r, node *t) {changert(r); access(t); splay(t); t->ch[0]->fa = null; t->ch[0] = null;}
node *findrt(node *r) {access(r); splay(r); while(r->ch[0] != null) r = r->ch[0]; return r;}
int ask(node *r, node *t) {changert(r); access(t); splay(t); return t->pos;}
void work(int u, int v, int edge) {
if (findrt(rt[u]) == findrt(rt[v])) {
int k = ask(rt[u], rt[v]);
if (E[k].b > E[edge - n].b) {
cut(rt[u], rt[k + n]);
cut(rt[v], rt[k + n]);
link(rt[u], rt[edge]);
link(rt[v], rt[edge]);
}
} else {
link(rt[u], rt[edge]);
link(rt[v], rt[edge]);
}
if (findrt(rt[1]) == findrt(rt[n]))
ans = min(ans, E[edge - n].a + E[ask(rt[1], rt[n])].b);
}
void AC() {printf("%d\n", ans == 0x7fffffff ? -1 : ans);}
} int main() {
LCT::Build();
for(int i = 1; i <= m ;++i)
LCT::work(E[i].x, E[i].y, i + n);
LCT::AC();
return 0;
}

我的代码就是一堵墙,让$300$行的$LinkCutTree$在压行大法前颤抖吧~~~

【BZOJ 3669】【NOI 2014】魔法森林 LCT+枚举边的更多相关文章

  1. 【BZOJ 3669】 [Noi2014]魔法森林 LCT维护动态最小生成树

    这道题看题意是在求一个二维最小瓶颈路,唯一可行方案就是枚举一维在这一维满足的条件下使另一维最小,那么我们就把第一维排序利用A小的边在A大的情况下仍成立来动态加边维护最小生成树. #include &l ...

  2. [NOI 2014]魔法森林

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

  3. 【bzoj 3669】[Noi2014]魔法森林

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

  4. bzoj 3669: [Noi2014]魔法森林 (LCT & kruskal)

    这道题呢, 首先按照关键字a排序,然后不断地加边,用lct维护这个过程 具体实现: 先按照关键字a排序,枚举每一条边,判断两点是否已经联通(kruskal 部分)如果联通,就在两点路径间寻找最大的b, ...

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

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

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

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

  7. bzoj 3669: [Noi2014] 魔法森林 LCT版

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

  8. BZOJ 3669: [Noi2014]魔法森林 [LCT Kruskal | SPFA]

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

  9. [NOI2014]魔法森林 LCT

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

随机推荐

  1. Loadrunner将字符串存为参数

    直接代码: Action() { //定义一个字符串 char *URL= "http://linux.cn"; /******************************** ...

  2. HDU2639Bone Collector II[01背包第k优值]

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  3. [No000009]学习重要还是经营人脉重要?

    大说数人的朋友圈都是这样的:雪中送炭的寥寥无几,锦上添花的大多数人连你自己都不认识,碰到倒霉的时候还能遇到落进下石的.人脉是很重要,可相对自身的学习来说,就没有想象中那么重要了. 有一次在北大讲座,遇 ...

  4. java 23 - 3 单例模式实现Runtime类

    Runtime:每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接. 其中一个方法: exec(String command) 在单独的进程中执行指定的字符串 ...

  5. iOS RunTime运行时(1):类与对象

    Objective-C语言是一门动态语言,他将很多静态语言在编译和链接期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码更具有灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一下 ...

  6. Web API 接口

    Web API 接口 在给网站编写 JavaScript 代码时,也有很多可用的 API.您可以使用下面的接口(也称为对象的类型)列表,开发 Web 应用程序或网站. 关于包含这些接口的 API 列表 ...

  7. iOS多线程杂论

    iOS多线程的分布 (1) NSThread (2) NSOperation (3) GCD 现在对下面三个进行一个个的分析,希望那里说得不对的地方希望简友们帮我指点一二. 1,NSThread 优点 ...

  8. PL/SQL流程控制语句

    PL/SQL流程控制语句介绍PL/SQL的流程控制语句, 包括如下三类:控制语句: IF 语句循环语句: LOOP语句, EXIT语句顺序语句: GOTO语句, NULL语句①if语句 IF < ...

  9. SQL2012删除作业失败的处理

    修改msdb数据库中的过程sp_delete_job,如下: USE [msdb] GO /****** Object: StoredProcedure [dbo].[sp_delete_job] S ...

  10. 网络/运维工程师visio2013模具图标 绘制漂亮的网络拓扑图 狮子XL工程师美学思想

    visio2013狮子XL自定义运维模具下载: 链接:http://pan.baidu.com/s/1bo779Kz 密码:xh3s 狮子XL 的美学思想: 1,一次痛苦,一生幸福. 之前,在绘制网络 ...