双倍经验题
像这种方案太多不能全部求出来但求前k大一般有这样一个思路
将所有方案无重复不漏的分为若干类,每个类的元素满足单调性,然后我们用堆维护就行了!
对于这道题,可以想到用树的分治来处理路径,当处理根为x时
我们处理当前的子树每个点i和之前的子树上的组成的路径,
我们完全可以把访问顺序状态记录成一条链(状态是nlogn规模不会爆)
当前子树的每个点i在链上都有一段连续的可选区间,这个区间的点和i构成一条过根x的路径
这样链上的每个点就代表了一类路径
很明显,我们就可以noi超级钢琴的做法来解决,st表预处理+堆维护

 type way=record
po,num,next:longint;
end;
node=record
l,r,s,t:longint;
end; var e:array[..] of way;
h:array[..] of node;
w:array[..,..] of longint;
d:array[..] of longint;
a:array[..] of longint;
q:array[..,..] of longint;
f,p,s:array[..] of longint;
v:array[..] of boolean;
l,r,root,len,t,tot,i,n,k,x,y,z,j:longint;
m:node; function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; function mx(x,y:longint):longint;
begin
if a[x]>a[y] then exit(x) else exit(y);
end; function ask(x,y:longint):longint;
var k:longint;
begin
k:=trunc(ln(y-x+)/ln());
exit(mx(w[x,k],w[y-d[k]+,k]));
end; procedure swap(var a,b:node);
var c:node;
begin
c:=a;
a:=b;
b:=c;
end; procedure add(x,y,z:longint);
begin
inc(len);
e[len].po:=y;
e[len].num:=z;
e[len].next:=p[x];
p[x]:=len;
end; procedure up(i:longint);
var j:longint;
begin
j:=i shr ;
while j> do
begin
if a[h[j].s]+a[h[j].t]<a[h[i].s]+a[h[i].t] then
begin
swap(h[i],h[j]);
i:=j;
j:=j shr ;
end
else break;
end;
end; procedure sift(i:longint);
var j:longint;
begin
j:=i shl ;
while j<=t do
begin
if (j<t) and (a[h[j+].s]+a[h[j+].t]>a[h[j].s]+a[h[j].t]) then inc(j);
if a[h[j].s]+a[h[j].t]>a[h[i].s]+a[h[i].t] then
begin
swap(h[i],h[j]);
i:=j;
j:=j shl ;
end
else break;
end;
end; procedure getroot(x,fa:longint);
var i,y:longint;
begin
s[x]:=;
f[x]:=;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if (y<>fa) and not v[y] then
begin
getroot(y,x);
s[x]:=s[x]+s[y];
f[x]:=max(f[x],s[y]);
end;
i:=e[i].next;
end;
f[x]:=max(f[x],tot-s[x]);
if f[x]<f[root] then root:=x;
end; procedure get(x,fa,len:longint);
var i,y:longint;
begin
inc(t);
a[t]:=len;
q[t,]:=l; q[t,]:=r;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if (y<>fa) and not v[y] then get(y,x,len+e[i].num);
i:=e[i].next;
end;
end; procedure work(x:longint);
var i,y:longint;
begin
v[x]:=true;
i:=p[x];
inc(t);
l:=t;
r:=t;
q[t,]:=l; q[t,]:=r;
while i<> do
begin
y:=e[i].po;
if not v[y] then
begin
r:=t;
get(y,x,e[i].num);
end;
i:=e[i].next;
end;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if not v[y] then
begin
root:=;
tot:=s[y];
getroot(y,);
work(root);
end;
i:=e[i].next;
end;
end; begin
readln(n,k);
for i:= to n- do
begin
readln(x,y,z);
add(x,y,z);
add(y,x,z);
end;
f[]:=;
tot:=n;
getroot(,);
work(root);
tot:=trunc(ln(t)/ln());
d[]:=;
for i:= to tot do
d[i]:=d[i-]*; for i:= to t do
w[i,]:=i;
for j:= to tot do
for i:= to t do
if i+d[j]-<=t then
w[i,j]:=mx(w[i,j-],w[i+d[j-],j-])
else break; tot:=t; t:=;
for i:= to tot do
begin
inc(t);
with h[t] do
begin
l:=q[i,]; r:=q[i,];
s:=i;
t:=ask(l,r);
end;
up(t);
end;
for i:= to k do
begin
writeln(a[h[].s]+a[h[].t]);
swap(h[],h[t]);
m:=h[t];
dec(t);
sift();
if m.t>m.l then
begin
inc(t);
with h[t] do
begin
l:=m.l; r:=m.t-;
s:=m.s;
t:=ask(l,r);
end;
up(t);
end;
if m.t<m.r then
begin
inc(t);
with h[t] do
begin
l:=m.t+; r:=m.r;
s:=m.s;
t:=ask(l,r);
end;
up(t);
end;
end;
end.

 

bzoj1267 3784的更多相关文章

  1. BZOJ 3784: 树上的路径

    Description 问一棵树上前 \(k\) 大路径的边权. Sol 边分治. 非常感谢数据没有菊花图. 为了写写边分治试试然后就开了这道题. 边分治非常好想,选一条重边,分成两部分,然后分别求最 ...

  2. bzoj 3784: 树上的路径 堆维护第k大

    3784: 树上的路径 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 88  Solved: 27[Submit][Status][Discuss] ...

  3. POJ 3784.Running Median

    2015-07-16 问题简述: 动态求取中位数的问题,输入一串数字,每输入第奇数个数时求取这些数的中位数. 原题链接:http://poj.org/problem?id=3784 解题思路: 求取中 ...

  4. bzoj 3784

    第三道点分治. 首先找到黄学长的题解,他叫我参考XXX的题解,但已经没有了,然后找到另一个博客的简略题解,没看懂,最后看了一个晚上黄学长代码,写出来然后,写暴力都拍了小数据,但居然超时,....然后改 ...

  5. HDU 3784 继续xxx定律 & HDU 2578 Dating with girls(1)

    HDU 3784 继续xxx定律 HDU 2578 Dating with girls(1) 做3748之前要先做xxx定律  对于一个数n,如果是偶数,就把n砍掉一半:如果是奇数,把n变成 3*n+ ...

  6. 【POJ 3784】 Running Median

    [题目链接] http://poj.org/problem?id=3784 [算法] 对顶堆算法 要求动态维护中位数,我们可以将1-M/2(向下取整)小的数放在大根堆中,M/2+1-M小的数放在小根堆 ...

  7. POJ 3784 Running Median (动态中位数)

    题目链接:http://poj.org/problem?id=3784 题目大意:依次输入n个数,每当输入奇数个数的时候,求出当前序列的中位数(排好序的中位数). 此题可用各种方法求解. 排序二叉树方 ...

  8. POJ 3784 Running Median【维护动态中位数】

    Description For this problem, you will write a program that reads in a sequence of 32-bit signed int ...

  9. Running Median POJ - 3784 (对顶堆/优先队列 | 链表)

    For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After ...

随机推荐

  1. [.Net MVC] Win7下IIS部署

    这里简单的分三步实现网站的部署. 一.发布 VS2013中有发布选项,在需要发布的工程项目上(就是设置为启动项目的那个)右键,点“发布”选项: 然后会弹出一个窗口: 选择自定义,随便输入一个名字,然后 ...

  2. About 'atoi'

    在很多地方我们看到的都是:atoi 是一个 C Reference function atoi() convert a string to an integer. This function of s ...

  3. c#编写简单计算器

    刚接触c#,依照惯例,写个简单的计算器,只写了加法,乘法,其他的类似,编辑器用的vs2008 首先打开vs ,新建c#的Windows窗体应用程序,接下来的项目的名称是WindowsFormsAppl ...

  4. Volley网络请求框架的基本用法

    备注: 本笔记是参照了 http://blog.csdn.net/ysh06201418/article/details/46443235  学习之后写下的 简介:  Volley是google官网退 ...

  5. PHP 类和继承

    //定义一个超类 //public 和 protectd属性和方法可以继承,private不可继承. class A{ public $a =0; private $b = 1; protected ...

  6. 不用jsonp实现跨域请求

    这几天要用到跨域请求,我在网上找了好多资料,最后自己研究出来一个比较简单方便的, 请求的过程和jquery普通的ajax一样.我用的是.net平台 ,IIS7.5 来看一下后台的代码,我是用MVC的C ...

  7. javascript检测是否安装了flash

    检测是否安装了flash function flashChecker() { var hasFlash = 0; //是否安装了flash var flashVersion = 0; //flash版 ...

  8. php导出word(可包含图片)

    为大家介绍一个 php 生成 导出word(可包含图片)的代码,有需要的朋友可以参考下. 之前介绍过php生成word的例子,只是不能包含图片与链接. 今天 为大家介绍一个 php 生成 导出word ...

  9. 挑战Python-20160826

    给你一字典a,如a={1:1,2:2,3:3},输出字典a的key,以','链接,如‘1,2,3'.

  10. 将TIBCO Host 实例注册为Windows服务

    安装了TIBCO ActiveMatrix BPM及成功创建了ActiveMatrix Administrator 和 BPM Server后,每次都要手动启动tibcohost,比较麻烦,实际上TI ...