bzoj 2599 数分治 点剖分
具体可以见漆子超的论文
/**************************************************************
Problem:
User: BLADEVIL
Language: Pascal
Result: Accepted
Time: ms
Memory: kb
****************************************************************/
//By BLADEVIL
var
n, m :longint;
pre, other, len :array[..] of longint;
last :array[..] of longint;
l, top :longint;
size, stack, yy, ll :array[..] of longint;
ff :array[..] of boolean;
root :longint;
b :array[..] of longint;
old :longint;
ans :longint;
procedure connect(x,y,z:longint);
begin
inc(l);
pre[l]:=last[x];
last[x]:=l;
other[l]:=y;
len[l]:=z;
end;
procedure dfs_size(x,fa:longint);
var
q, p :longint;
begin
size[x]:=;
inc(top);
stack[top]:=x;
q:=last[x];
while q<> do
begin
p:=other[q];
if (ff[q]) or (p=fa) then
begin
q:=pre[q];
continue;
end;
dfs_size(p,x);
inc(size[x],size[p]);
q:=pre[q];
end;
yy[x]:=fa;
end;
procedure getroot(u:longint);
var
ms, s, x, p, q :longint;
i :longint;
begin
top:=;
dfs_size(u,);
ms:=maxlongint;
for i:= to top do
begin
x:=stack[i];
s:=size[u]-size[x];
q:=last[x];
while q<> do
begin
p:=other[q];
if (ff[q]) or (p=yy[x]) then
begin
q:=pre[q];
continue;
end;
if size[p]>s then s:=size[p];
q:=pre[q];
end;
if s<ms then
begin
ms:=s;
root:=x;
end;
end;
end;
procedure dfs_value(x,fa,lz,dep:longint);
var
q, p :longint;
begin
if lz>m then exit;
if dep>=ans then exit;
if b[m-lz]>= then
if b[m-lz]+dep<ans then ans:=b[m-lz]+dep;
if (b[lz]<) or (dep<b[lz]) then
begin
inc(top);
stack[top]:=lz;
ll[top]:=dep;
end;
q:=last[x];
while q<> do
begin
p:=other[q];
if (p=fa) or (ff[q]) then
begin
q:=pre[q];
continue;
end;
dfs_value(p,x,lz+len[q],dep+);
q:=pre[q];
end;
end;
procedure solve(u:longint);
var
i, q, p :longint;
begin
getroot(u);
if top= then exit;
top:=;
q:=last[root];
while q<> do
begin
p:=other[q];
if ff[q] then
begin
q:=pre[q];
continue;
end;
old:=top+;
dfs_value(p,root,len[q],);
for i:=old to top do
if (b[stack[i]]<) or (b[stack[i]]>ll[i]) then b[stack[i]]:=ll[i];
q:=pre[q];
end;
for i:= to top do b[stack[i]]:=-;
q:=last[root];
while q<> do
begin
p:=other[q];
if ff[q] then
begin
q:=pre[q];
continue;
end;
ff[q]:=true;
ff[q xor ]:=true;
solve(p);
q:=pre[q];
end;
end;
procedure main;
var
i :longint;
x, y, z :longint;
begin
read(n,m);
l:=;
fillchar(b,sizeof(b),$ff);
b[]:=;
for i:= to n- do
begin
read(x,y,z);
inc(x); inc(y);
connect(x,y,z);
connect(y,x,z);
end;
ans:=maxlongint;
solve();
if ans> then writeln(-) else writeln(ans);
end;
begin
main;
end.
bzoj 2599 数分治 点剖分的更多相关文章
- bzoj 2599(点分治)
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBSubmit: 3642 Solved: 1081[Submit][Statu ...
- BZOJ 2243 染色 | 树链剖分模板题进阶版
BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...
- BZOJ 2599: [IOI2011]Race( 点分治 )
数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新 ...
- bzoj 2599 [IOI2011]Race (点分治)
[题意] 问树中长为k的路径中包含边数最少的路径所包含的边数. [思路] 统计经过根的路径.假设当前枚举到根的第S个子树,若x属于S子树,则有: ans<-dep[x]+min{ dep[y] ...
- BZOJ 2599 [IOI2011]Race【Tree,点分治】
给出N(1 <= N <= 200000)个结点的树,求长度等于K(1 <= K <= 1000000)的路径的最小边数. 点分治,这道题目和POJ 2114很接近,2114是 ...
- 【BZOJ 2599】【IOI 2011】Race 点分治
裸的点分治,然而我因为循环赋值$s$时把$i <= k$写成$i <= n$了,WA了好长时间 #include<cstdio> #include<cstring> ...
- BZOJ 2599 Race(树分治)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2599 题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 题意:每次 ...
- bzoj 2599: [IOI2011]Race (点分治 本地过了就是过了.jpg)
题面:(复制别人的...) Description 给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. Input 第一行 两个整数 n, k第二..n行 每行三个整数 表示一条无向边的 ...
- bzoj 2599: [IOI2011]Race【点分治】
点分治,用一个mn[v]数组记录当前root下长为v的链的最小深度,每次新加一个儿子的时候都在原来儿子更新过的mn数组里更新ans(也就是查一下mn[m-dis[p]]+de[p]) 这里注意更新和初 ...
随机推荐
- html判断IE版本
html判断IE版本 . <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--> . <!--[if IE]> ...
- 解决:JS如何取得当前正在执行的function的名字
代码如下 function getFName(fn){ return (/^[\s\(]*function(?:\s+([\w$_][\w\d$_]*))?\(/).exec(fn.toString( ...
- delphi的几个特别关键字 object absolute
1.object关键字相当于C++中的struct, record定义个结构体只能定义数据,而object可以定义方法,默认都是public的. 代码示例如下: TTest = record na ...
- iOS开发常用的宏
#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)#define SCREEN_HEIGHT ([UIScreen mainS ...
- rails笔记
rake -T 列出全部taskconfig.active_record.schema_format = :sql #remove the old db/schema.rb file, create ...
- LaTex中让页码从正文开始编号
在正文和目录之前这样设置即可 \setcounter{page}{}
- @Async java 异步方法
在spring 3中,@Async注解能让某个方法快速变为异步执行,马上来先DEMO上手下. 假如在网站的用户注册后,需要发送邮件,然后用户得到邮件确认后才能继续其他工作: 假设发送是一个很耗费时间的 ...
- C语言 将产生的随机数存入数组,数据不能相同
1.定义一个一维数,数组大小为24. 2.产生0~23的随机数. 3.将产生的随机数存入i数组,要求数组中的每个数据不能相同. 4.补充说明,这个子程序要求每次调用后,这个数组里面就 存放了0~23这 ...
- afddaf
//import javax.swing.*; import javax.swing.JFrame; import javax.swing.JButton; import javax.swing.JL ...
- SQL中的内连接外连接和交叉连接是什么意思?
内连接又分为等值连接.自然连接和不等连接三种. 外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN).右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接( ...