poj1741 bzoj2152
树分治入门
poj1741是男人八题之一,经典的树分治的题目
这里用到的是点分治
核心思想是我们把某个点i作为根,把路径分为过点i和不过点i
先统计过点i这样的路径数,然后在统计其子树中的答案,这样就不断地划分成规模较小子问题。
要使划分最优,我们每次都选的是树的重心
type node=record
len,next,po:longint;
end; var e:array[..] of node;
w,p,d,a,size:array[..] of longint;
v:array[..] of boolean;
root,sum,n,t,ans,k,i,x,y,z,len:longint; function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
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
y:=a[i];
a[i]:=a[j];
a[j]:=y;
inc(i);
j:=j-;
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end; procedure add(x,y,z:longint);
begin
inc(len);
e[len].po:=y;
e[len].len:=z;
e[len].next:=p[x];
p[x]:=len;
end; procedure getroot(x,fa:longint); //选择重心
var i,y:longint;
begin
i:=p[x];
size[x]:=;
w[x]:=;
while i<> do
begin
y:=e[i].po;
if (not v[y]) and (y<>fa) then
begin
getroot(y,x);
size[x]:=size[x]+size[y];
w[x]:=max(w[x],size[y]);
end;
i:=e[i].next;
end;
w[x]:=max(w[x],sum-size[x]);
if w[x]<w[root] then root:=x;
end; procedure deep(x,fa:longint);
var i,y:longint;
begin
inc(t);
a[t]:=d[x];
i:=p[x];
while i<> do
begin
y:=e[i].po;
if not v[y] and (y<>fa) then
begin
d[y]:=d[x]+e[i].len;
deep(y,x);
end;
i:=e[i].next;
end;
end; function calc(x,now:longint):longint;
var i,l,r:longint;
begin
t:=;
d[x]:=now;
calc:=;
deep(x,);
sort(,t);
l:=;
r:=t;
while l<r do
begin
if a[l]+a[r]<=k then
begin
calc:=calc+r-l;
inc(l);
end
else dec(r);
end;
end; procedure work(x:longint);
var i,y:longint;
begin
ans:=ans+calc(x,);
i:=p[x];
v[x]:=true;
while i<> do
begin
y:=e[i].po;
if not v[y] then
begin
ans:=ans-calc(y,e[i].len); //之前的计算会导致lca不为root的点对被算入,实际它们的路径不过重心,这里要减去
sum:=size[y];
root:=;
getroot(y,);
work(root);
end;
i:=e[i].next;
end;
end; begin
readln(n,k);
while n<> do
begin
len:=;
fillchar(p,sizeof(p),);
for i:= to n- do
begin
readln(x,y,z);
add(x,y,z);
add(y,x,z);
end;
fillchar(v,sizeof(v),false);
sum:=n;
w[]:=;
getroot(,);
ans:=;
work(root);
writeln(ans);
readln(n,k);
end;
end.
bzoj2152是更水的树分治……
poj1741 bzoj2152的更多相关文章
- 点分治Day1
树套树Day2暂且搁置...因为Day1的题我各种不会做... 唯一过了一道还是整体二分过的... 我们来一点愉快的算法,先不考虑数据结构这种骚东西了 毕竟还在发烧,就先码码这几天在搞的点分治吧 hx ...
- 【poj1741】 Tree
http://poj.org/problem?id=1741 (题目链接) 题意 给出一个n个节点的带权树,求树上距离不超过K的所有点对的个数. solution 点分治裸题.所谓的点分治,就是对于 ...
- 【bzoj2152】 聪聪可可
http://www.lydsy.com/JudgeOnline/problem.php?id=2152 (题目链接) 题意 给出一棵n个节点的带权树,求有多少点对的距离是3的倍数. solution ...
- 【BZOJ2152】聪聪可可(点分治)
[BZOJ2152]聪聪可可(点分治) 题面 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电 ...
- POJ1741 Tree(树分治——点分治)题解
题意:给一棵树,问你最多能找到几个组合(u,v),使得两点距离不超过k. 思路:点分治,复杂度O(nlogn*logn).看了半天还是有点模糊. 显然,所有满足要求的组合,连接这两个点,他们必然经过他 ...
- BZOJ2152 [国家集训队] 聪聪可可 [点分治]
题目传送门 聪聪可可 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 5237 Solved: 2750[Submit][Status][Discuss ...
- 【POJ1741】Tree(点分治)
[POJ1741]Tree(点分治) 题面 Vjudge 题目大意: 求树中距离小于\(K\)的点对的数量 题解 完全不觉得点分治了.. 简直\(GG\),更别说动态点分治了... 于是来复习一下. ...
- POJ1741 Tree + BZOJ1468 Tree 【点分治】
POJ1741 Tree + BZOJ1468 Tree Description Give a tree with n vertices,each edge has a length(positive ...
- BZOJ2152 聪聪可可 【点分治】
BZOJ2152 聪聪可可 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问 ...
随机推荐
- WPFX名称空间
1:x名称空间里的成员是专门写给xaml编译器看,用来引导xaml编译器把xaml代码编译成CLR代码的.(x仅仅是xaml的首字母). 2:attribute 是语言层面的东西,是给编译器看的,Pr ...
- Dell Remote Access Controller 添加和配置 DRAC/MC 用户
iDRAC设置 单击“Configuration”(配置)选项卡并选择“Users”(用户). 单击“Username”(用户名)列下的 [Available](可用)添加新用户,或单击“Userna ...
- Library vector Type
vector的定义 vector是C++标准库里最常用的容器,它之所以被称为容器,是因为它可以存放多个对象,所有在用一个容器中的对象都应该具有相同的类型. vector也是一个类模板,这也是它能存放多 ...
- 'DEVENV' is not recognized as an internal or external command,
使用命令行 DEVENV 编译c# 工程, C:\MyProject>DEVENV "MyProject.sln" /build Release /useenv'DEVENV ...
- Jquery EasyUI中treegrid的中右键菜单和一般按钮同时绑定事件时的怪异事件
做个项目使用jquery easyui来做前端,也许是对此不是很熟悉,总是发现一些不可理解的事件. 主要源代码如下: <script type="text/javascript&qu ...
- ubuntu apt-get
近期重新拿起linux的书看了下,整理了一下linux的命令. ubuntu预装了APT和dpkg ,“APT”是 “Advanced Package Tool”的简写,“dpkg ”是“Debian ...
- C# 在SQLite数据库中存储图像 z
C# 在SQLite数据库中存储图像 更多 0 C# SQLite 建表语句 CREATE TABLE [ImageStore]([ImageStore_Id] INTEGER NOT NULL ...
- 韦东山教程ARM的时钟设置出现的问题及其解决方法
时钟设置是一个非常重要的环节,如果系统没有合适的时钟,根本无法工作. S3C2440的时钟复杂,分为FCLK,HCLK,PCLK. 在程序测试中,曾出现这样一个错误.系统当前FCLK为400 ...
- 从IT的角度思考BIM(二):模式与框架
我们满怀着美好期许,鼓起勇气敲响了 BIM 世界的大门.忽然人群中有人高呼:BIM 已死,大家都散了吧! 这时人群开始骚动起来.“我早就说这玩意是忽悠人的吧,你们不信还偏要来”,“我花了好多钱准备这次 ...
- IntelliJ IDEA 使用随笔
注册的地址:http://idea.iteblog.com/key.php