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 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问 ...
随机推荐
- MongoDB中的分组
一.MongoDB中的Count函数.Distinct函数以及分组 准备工作,插入一个班级的文档 > for(var i=0;i<10;i++){ ... db.Classes.inser ...
- ios隐藏导航栏底线条和导航、状态栏浙变色
方法一遍历法: 在你需要隐藏的地方调用如下代码 [self findlineviw:self.navigationBar].hidden = YES; -(UIImageView*)findlinev ...
- iOS开发——友盟分享
==========2016-01-29 更新=====刘成利 email:liu_cheng_li@qq.com========== 自己成功集成到公司的项目前,也已做了测试好的友盟分享demo 目 ...
- 获取通讯录的信息(关于iOS9.0之后新的框架-ContactFramework)
转载自:http://my.oschina.net/u/2340880/blog/511995?p={{totalPage}} 一.引言 在以前iOS开发中,涉及联系人相关的编程,代码都非常繁琐,并且 ...
- c# 串口发送接收数据
/********************** 串口数据接收事件 *****************************/ private void SerialPort_DataReceived ...
- 05_天气查询_JAX-WS方式_客户端
[客户端特点] 支持面向对象开发. 客户端功能调用webService,首先得知道WebService的地址. 一般情况下,只要知道了wsdl的地址,就可以知道WebService的地址. 我们上一篇 ...
- HDU 2089 不要62(数位DP)
不要62 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了, ...
- Chi Square Distance
The chi squared distance d(x,y) is, as you already know, a distance between two histograms x=[x_1,.. ...
- c++学习笔记2(c++简单程序)
c++的简单程序 练习一: #include <iostream>int main(){std::cout<<"你好c++\n";int x;std::ci ...
- html5写的一个时钟
看到的一个html5写的时钟 <!doctype> <html> <head> <script> window.onload=function(){ v ...