bzoj3669
不难想到从小到大穷举a,判断在携带不超过a个B型精灵的情况下最少携带多少个B型精灵
这是一个经典的问题,显然要求出最小生成树,树上1到N路径上最大的边即是答案
所以我们要动态维护一个最小生成树可以用link cut tree维护
根据最小生成树的回路性质,我们加入一条边(u,v),保留树上u-v路径上最大边和新边中小的那个
由于这里维护的是边权,我们可以把每条边当做一个点p(u,v),连接(u,v)时,即是连接(u,p)和(v,p)
然后记录下路径上最大点权的编号即可
- var son:array[..,..] of longint;
- q,f,w,fa,v:array[..] of longint;
- rev:array[..] of boolean;
- s,e,a,b:array[..] of longint;
- ans,i,n,m:longint;
- function min(a,b:longint):longint;
- begin
- if a>b then exit(b) else exit(a);
- end;
- function getf(x:longint):longint;
- begin
- if f[x]<>x then f[x]:=getf(f[x]);
- exit(f[x]);
- end;
- procedure swap(var a,b:longint);
- var c:longint;
- begin
- c:=a;
- a:=b;
- b:=c;
- end;
- function root(x:longint):boolean;
- begin
- exit((son[fa[x],]<>x) and (son[fa[x],]<>x));
- end;
- procedure update(x:longint);
- begin
- w[x]:=x;
- if v[w[son[x,]]]>v[w[x]] then w[x]:=w[son[x,]];
- if v[w[son[x,]]]>v[w[x]] then w[x]:=w[son[x,]];
- end;
- procedure push(x:longint);
- begin
- if rev[x] then
- begin
- rev[son[x,]]:=not rev[son[x,]];
- rev[son[x,]]:=not rev[son[x,]];
- swap(son[x,],son[x,]);
- rev[x]:=false;
- end;
- end;
- procedure rotate(x,w:longint);
- var y:longint;
- begin
- y:=fa[x];
- if not root(y) then
- begin
- if son[fa[y],]=y then son[fa[y],]:=x
- else son[fa[y],]:=x;
- end;
- fa[x]:=fa[y];
- son[y,-w]:=son[x,w];
- if son[x,w]<> then fa[son[x,w]]:=y;
- son[x,w]:=y;
- fa[y]:=x;
- update(y);
- end;
- procedure splay(x:longint);
- var y,t,i:longint;
- begin
- t:=;
- i:=x;
- while not root(i) do
- begin
- inc(t);
- q[t]:=i;
- i:=fa[i];
- end;
- inc(t);
- q[t]:=i;
- for i:=t downto do
- push(q[i]);
- while not root(x) do
- begin
- y:=fa[x];
- if root(y) then
- begin
- if son[y,]=x then rotate(x,)
- else rotate(x,);
- end
- else begin
- if son[fa[y],]=y then
- begin
- if son[y,]=x then rotate(y,)
- else rotate(x,);
- rotate(x,);
- end
- else begin
- if son[y,]=x then rotate(x,)
- else rotate(y,);
- rotate(x,);
- end;
- end;
- end;
- update(x);
- end;
- procedure access(x:longint);
- var y:longint;
- begin
- y:=;
- repeat
- splay(x);
- son[x,]:=y;
- update(x);
- y:=x;
- x:=fa[x];
- until x=;
- end;
- procedure sort(l,r: longint);
- var i,j,x,y: longint;
- begin
- i:=l;
- j:=r;
- x:=a[(l+r) div ];
- repeat
- while a[i]<x do inc(i);
- while x<a[j] do dec(j);
- if not(i>j) then
- begin
- swap(s[i],s[j]);
- swap(e[i],e[j]);
- swap(a[i],a[j]);
- swap(b[i],b[j]);
- inc(i);
- j:=j-;
- end;
- until i>j;
- if l<j then sort(l,j);
- if i<r then sort(i,r);
- end;
- procedure makeroot(x:longint);
- begin
- access(x);
- splay(x);
- rev[x]:=not rev[x];
- end;
- procedure path(x,y:longint);
- begin
- makeroot(x);
- access(y);
- splay(y);
- end;
- procedure link(x,y:longint);
- begin
- makeroot(x);
- fa[x]:=y;
- end;
- procedure cut(x,y:longint);
- begin
- makeroot(x);
- access(y);
- splay(y);
- son[y,]:=;
- fa[x]:=;
- end;
- procedure deal(i:longint);
- var x,y,z:longint;
- begin
- x:=getf(s[i]);
- y:=getf(e[i]);
- if x<>y then
- begin
- f[x]:=y;
- link(s[i],n+i);
- link(e[i],n+i);
- end
- else begin
- x:=s[i];
- y:=e[i];
- path(x,y);
- z:=w[y];
- if v[z]>b[i] then
- begin
- cut(s[z-n],z);
- cut(e[z-n],z);
- link(s[i],n+i);
- link(e[i],n+i);
- end;
- end;
- end;
- begin
- readln(n,m);
- for i:= to m do
- readln(s[i],e[i],a[i],b[i]);
- for i:= to n do
- f[i]:=i;
- sort(,m);
- for i:= to m do
- begin
- v[n+i]:=b[i];
- w[n+i]:=n+i;
- end;
- ans:=;
- i:=;
- while i<m do
- begin
- inc(i);
- deal(i);
- while a[i]=a[i+] do
- begin
- inc(i);
- deal(i);
- end;
- if getf()=getf(n) then
- begin
- path(,n);
- ans:=min(ans,a[i]+v[w[n]]);
- end;
- end;
- if ans= then writeln(-)
- else writeln(ans);
- end.
bzoj3669的更多相关文章
- 【BZOJ3669】【Noi2014】魔法森林(Link-Cut Tree)
[BZOJ3669][Noi2014]魔法森林(Link-Cut Tree) 题面 题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n ...
- 【BZOJ3669】【NOI2014】魔法森林 LCT
题目描述 给你一个\(n\)个点\(m\)条边的图,每条边有两个边权\(a,b\).请你找出从\(1\)到\(n\)一条路径,使得这条路径上边权\(a\)的最大值\(+\)边权\(b\)的最大值最小. ...
- bzoj3669: [Noi2014]魔法森林 lct版
先上题目 bzoj3669: [Noi2014]魔法森林 这道题首先每一条边都有一个a,b 我们按a从小到大排序 每次将一条路劲入队 当然这道题权在边上 所以我们将边化为点去连接他的两个端点 当然某两 ...
- 【BZOJ3669】魔法森林(LCT)
题意:有一张无向图,每条边有两个权值.求选取一些边使1和n连通,且max(a[i])+max(b[i])最小 2<=n<=50,000 0<=m<=100,000 1<= ...
- [bzoj3669][Noi2014]魔法森林_LCT_并查集
魔法森林 bzoj-3669 Noi-2014 题目大意:说不明白题意系列++……题目链接 注释:略. 想法:如果只有1个参量的话spfa.dij什么的都上来了. 两个参量的话我们考虑,想将所有的边按 ...
- 【BZOJ3669】[Noi2014]魔法森林 LCT
终于不是裸的LCT了...然而一开始一眼看上去这是kruskal..不对,题目要求1->n的路径上的每个点的两个最大权值和最小,这样便可以用LCT来维护一个最小生成路(瞎编的...),先以a为关 ...
- BZOJ3669 (动态树)
Problem 魔法森林 (NOI2014) 题目大意 给n个点,m条边的无向图,每条边有两个权值a,b. 求一条从1-->n的路径,使得这条路径上max(a)+max(b)最小.输出最小值即可 ...
- bzoj3669[Noi2014]魔法森林
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- BZOJ-3669 魔法森林 Link-Cut-Tree
意识到背模版的重要性了,记住了原理和操作,然后手打模版残了..颓我时间...... 3669: [Noi2014]魔法森林 Time Limit: 30 Sec Memory Limit: 512 M ...
随机推荐
- mark jquery 链式调用的js原理
我们在使用jquery的时候会用到类似$("#id").css('color','red').show(200); 这样写有点减少代码量,减少了逐步查询DOM的性能损耗: js 原 ...
- JavaWeb_Day10_学习笔记1_response(3、4、5、6、7、8、9)发送状态码、响应、重定向、定时刷新、禁用浏览器缓存、响应字节数据、快捷重定向方法、完成防盗链
今天学习重点: 1.response和request响应和应答分别学习: 请求响应流程图 response 1 response概述 response是Servlet.service方法 ...
- 安装oracle pl/sql developer
1.在官网上下载oracle 11g R2版本的数据库,直接常规安装.数据库可以下载32bit. 2.在这里下载oracle client (32bit)http://www.oracle.com/t ...
- 什么是NSTimer
本文主要是介绍什么是NSTimer,具体使用请参考上一篇博客. 1.什么是NSTimer? NSTimer就是timer就是一个能在从现在开始的后面的某一个时刻或者周期性的执行我们指定的方法的对象. ...
- Solr集群的搭建以及使用(内涵zookeeper集群的搭建指南)
1 什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud.当一个系统的索引数据量少的时候 ...
- 日期字符串转换为NSDate
// 纯数字日期 NSString *str1 = "; // 日期字符串 NSString *str2 = @"2015/05/12 10:22:01"; // 带时区 ...
- ABP手机端调用API时的CORS
这个问题其实很早就考虑了,当时因为也没有特别着急去解决这个问题,就一直拖着.... 好吧,拖延症是不好的,所有不懒得做的,终将会逼着你去再很短的时间内去解决问题...实现项目 改写一个已有的webfo ...
- spark-shell - 将结果保存成一个文件
sqlContext.sql(""" SELECT user_no,cust_id,oper_code FROM cui.operation_data_an ...
- BFC与hasLayout之间的故事
刚拒绝了一个很有诱惑的公司,不是不想去,而是对现在的能力还不确定,希望能够进一步提高自己的技能,所有想写博客了,监督自己的学习进度·········现在还没有开放博客,希望成熟一些后再开放吧! 进入正 ...
- css实现的透明三角形
css实现下图样式,具体像素值记不住了,很好设置,html code (2014百度秋招面试题): <div id="demo"></div> 分析:这 ...