本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

题目链接:BZOJ

     UOJ

正解:LCT

解题报告:

  考虑这种两维约束的问题,一般都是限制一维,最小化另一维度。

  那么我按a排序之后,一条一条往里面加,如果不连通,直接加进去,否则肯定是查询一下原来的边上的最大的b权值。

  如果当前b权值大于最大的b值就不管,否则应该删掉这条最大的边,把这条新的边加进去。

  显然加边删边用LCT就可以解决,而边权的查询如何维护呢?

  如果是点权就很好办了,我们不妨把边权想点办法变成点权。

  直接在这条边连接的两个点之间新建一个点,作为中转点,点权就是原边边权。这样我们就巧妙地把边权转换成好维护的点权了。

  考虑这样做的正确性,因为辅助树实质上与原树并无关联,始终都能保持原树的相对位置。所以加入的这个虚点不会被剥离出来。

  又因为一些SB的细节错误调了很久...

//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <complex>
using namespace std;
typedef long long LL;
typedef long double LB;
typedef complex<double> C;
const double pi = acos(-1);
const int MAXN = 250011;
const int MAXM = 100011;
int n,m,tr[MAXN][2],tag[MAXN],father[MAXN],ans,pos,F[MAXN];
int top,stack[MAXN],a[MAXN],mx[MAXN],from[MAXN],match[MAXN][2];
struct edge{ int x,y,a,b; }e[MAXM];
inline bool cmpa(edge q,edge qq){ if(q.a==qq.a) return q.b<qq.b; return q.a<qq.a; }
inline bool isroot(int x){ return (tr[father[x]][0]!=x) && (tr[father[x]][1]!=x); }
inline void upd(int x,int y){ if(mx[y]>mx[x]) { mx[x]=mx[y]; from[x]=from[y]; } }
inline int find(int x){ if(F[x]!=x) F[x]=find(F[x]); return F[x]; }
inline int getint(){
int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
} inline void update(int x){
mx[x]=a[x]; from[x]=x;
int l=tr[x][0],r=tr[x][1];
if(l) upd(x,l);
if(r) upd(x,r);
} inline void pushdown(int x){
if(tag[x]==0) return ;
tag[tr[x][0]]^=1; tag[tr[x][1]]^=1;
tag[x]=0;//!!!
swap(tr[x][0],tr[x][1]);
} inline void rotate(int x){
int y,z; y=father[x]; z=father[y];
int l,r; l=(tr[y][1]==x); r=l^1;
if(!isroot(y)) tr[z][(tr[z][1]==y)]=x;
father[x]=z; father[y]=x;
father[tr[x][r]]=y; tr[y][l]=tr[x][r]; tr[x][r]=y;
update(y); update(x);
} inline void splay(int x){
top=0; stack[++top]=x; int y,z;
for(int i=x;!isroot(i);i=father[i]) stack[++top]=father[i];
for(int i=top;i>=1;i--) pushdown(stack[i]); while(!isroot(x)) {
y=father[x]; z=father[y];
if(!isroot(y)) {
if((tr[y][0]==x) ^ (tr[z][0]==y)) rotate(x);
else rotate(y);
}
rotate(x);
}
} inline void access(int x){
int last=0;
while(x) {
splay(x);
tr[x][1]=last;
update(x);/*!!!*/
last=x;
x=father[x];
}
} inline void move_to_root(int x){
access(x);
splay(x);
tag[x]^=1;
} inline void link(int x,int y){
move_to_root(x);
father[x]=y;
//splay(x);
} inline void cut(int x,int y){
move_to_root(x); access(y); splay(y);
tr[y][0]=father[x]=0; update(y);/*!!!*/
} inline void build(edge b){
n++; a[n]=b.b; match[n][0]=b.x; match[n][1]=b.y;
link(b.x,n);
link(b.y,n);
} inline int query(int x,int y){
move_to_root(x);
access(y);
splay(y);//!!!
pos=from[y];
return mx[y];
} inline void work(){
n=getint(); m=getint(); for(int i=1;i<=m;i++) { e[i].x=getint(); e[i].y=getint(); e[i].a=getint(); e[i].b=getint(); }
sort(e+1,e+m+1,cmpa); int now; ans=(1<<30); int savn=n;
for(int i=n+m;i>=1;i--) F[i]=i;
for(int i=1;i<=m;i++) {
if(find(e[i].x)!=find(e[i].y)) {
build(e[i]);
F[find(e[i].x)]=find(e[i].y);
if(find(1)==find(savn))
ans=min(ans,query(1,savn)+e[i].a);
continue;
}
now=query(e[i].x,e[i].y);
if(now<=e[i].b) continue;
cut(pos,match[pos][0]);
cut(pos,match[pos][1]);
build(e[i]);
if(find(1)==find(savn))
ans=min(ans,e[i].a+query(1,savn));
}
if(ans==(1<<30)) printf("-1");
else printf("%d",ans);
} int main()
{
work();
return 0;
}

  

BZOJ3669/UOJ3 魔法森林(LCT)的更多相关文章

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

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

  2. bzoj3669: [Noi2014]魔法森林 lct

    记得去年模拟赛的时候好像YY出二分答案枚举a,b的暴力,过了55欸 然后看正解,为了将两维变成一维,将a排序,模拟Kruskal的加边过程,同时维护1到n的最大值,加入一条边e(u,v,a,b)时有以 ...

  3. [bzoj3669][Noi2014]魔法森林——lct

    Brief description 给定一个无向图,求从1到n的一条路径使得这条路径上最大的a和b最小. Algorithm Design 以下内容选自某HN神犇的blog 双瓶颈的最小生成树的感觉, ...

  4. [BZOJ3669] [NOI2004] 魔法森林 LCT维护最小生成树

    题面 一开始看到这道题虽然知道是跟LCT维护最小生成树相关的但是没有可以的去想. 感觉可以先二分一下总的精灵数,但是感觉不太好做. 又感觉可以只二分一种精灵,用最小生成树算另一种精灵,但是和似乎不单调 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Spring中 PROPAGATION_REQUIRED 解释

    转自:https://blog.csdn.net/bigtree_3721/article/details/53966617 事务传播行为种类 Spring在TransactionDefinition ...

  2. maven 的构建异常 Could not find artifact ... and 'parent.relativePath'

    完整的异常提示: Non-resolvable parent POM: Could not find artifact com.ecp:ecp-main:pom:0.0.1-SNAPSHOT and ...

  3. shopxx----权限添加

    shiro权限控制 一.角色管理请求地址 1.模板地址 /shopxx/WebContent/WEB-INF/template/admin/role/list.ftl shiro 权限拦截 配置安全管 ...

  4. SharePoint服务器端对象模型 完结

    整个系列已完结,大概看了一眼,平均阅读量不到200.估计也没什么人看了,而且服务器端对象模型除了在某些企业开发中会用到,从2013时代开始其实已经不是SharePoint开发的最佳选择了.不过既然已经 ...

  5. Android Download机制详解(一)DocumentUI部分

    在Android中Google为我们集成了一套十分便利的Download机制,用来下载网络上的资源文件.以此省去了我们编写和维护大量与Download相关的代码. 组成 Android中Downloa ...

  6. SEO优化 给a标签添加rel="nofollow"

    为什么要使用nofollow标签? 我们使用nofollow标签的目的是很明确的,就是减少蜘蛛对页面上垃圾链接的爬行和传递权重,或者减少蜘蛛对页面上“无用”链接的爬行和传递链接权重. 这里所说的无用是 ...

  7. 文件操作 - 三元运算/chardet/文件操作r w/文件的操作方法

    Alex:读书可以改变一个人的气质读书:豆瓣: 1年读20本 你的问题:想法太多,读书太少 书:追风筝的人,白鹿原  电影:阿甘正传 辛德勒名单---------------------------- ...

  8. Collections工具类的使用

    创建实体类 public class News implements Comparable { private int id; //新闻编号 private String title; //新闻标题 ...

  9. view简写 TemplateView.as_view()

    view简写 TemplateView.as_view() https://code.ziqiangxuetang.com/django/django-generic-views.html (1)如果 ...

  10. selenium入门基础知识

    内容转载自:http://blog.csdn.net/huangbowen521/article/details/7816538 1.selenium介绍: Selenium是一个浏览器自动化操作框架 ...