POJ 2114 Boatherds 划分树
标题效果:鉴于一棵树,问有两点之间没有距离是k的。
数据的多组
思维:和IOI2011的Race喜欢。不是这么简单。阅读恶心,我是在主要功能的别人的在线副本。
CODE:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 10010
#define INF 0x3f3f3f3f
using namespace std; int points,k;
int head[MAX],total;
int next[MAX << 1],aim[MAX << 1],length[MAX << 1]; int _total,_size,size[MAX];
int ans,root;
bool v[MAX];
int dis[MAX],p; inline void Initialize();
inline void Add(int x,int y,int len); void Work(int x);
void GetRoot(int x,int last);
inline int Count(int x,int last,int len);
void GetDis(int x,int last,int len); int main()
{
while(scanf("%d",&points) != EOF && points) {
Initialize();
for(int y,z,i = 1;i <= points; ++i) {
while(scanf("%d",&y) != EOF && y) {
scanf("%d",&z);
Add(i,y,z),Add(y,i,z);
}
}
while(scanf("%d",&k) != EOF && k) {
ans = 0;
size[1] = points;
memset(v,false,sizeof(v));
Work(1);
if(ans) puts("AYE");
else puts("NAY");
}
puts(".");
}
return 0;
} inline void Initialize()
{
total = 0;
memset(head,0,sizeof(head));
} inline void Add(int x,int y,int len)
{
next[++total] = head[x];
aim[total] = y;
length[total] = len;
head[x] = total;
} void Work(int x)
{
_size = INF,_total = size[x];
GetRoot(x,0);
x = root;
v[x] = true;
ans += Count(x,0,0);
for(int i = head[x];i;i = next[i]) {
if(v[aim[i]]) continue;
ans -= Count(aim[i],x,length[i]);
Work(aim[i]);
}
} void GetRoot(int x,int last)
{
size[x] = 1;
int max_size = 0;
for(int i = head[x];i;i = next[i]) {
if(aim[i] == last || v[aim[i]]) continue;
GetRoot(aim[i],x);
size[x] += size[aim[i]];
max_size = max(max_size,size[aim[i]]);
}
max_size = max(max_size,_total - size[x]);
if(max_size < _size)
_size = max_size,root = x;
} inline int Count(int x,int last,int len)
{
p = 0;
GetDis(x,last,len);
sort(dis + 1,dis + p + 1);
int l = 1,r = p,re = 0;
while(l < r) {
if(dis[l] + dis[r] > k) --r;
else if(dis[l] + dis[r] < k) ++l;
else {
if(dis[r] == dis[l]) {
re += (r - l) * (r - l + 1) >> 1;
break;
}
int _l = l,_r = r;
while(dis[l] == dis[_l]) _l++;
while(dis[r] == dis[_r]) _r--;
re += (_l - l) * (r - _r);
l = _l,r = _r;
}
}
return re;
} void GetDis(int x,int last,int len)
{
dis[++p] = len;
for(int i = head[x];i;i = next[i]) {
if(aim[i] == last || v[aim[i]]) continue;
GetDis(aim[i],x,len + length[i]);
}
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
POJ 2114 Boatherds 划分树的更多相关文章
- poj 2114 Boatherds (树分治)
链接:http://poj.org/problem?id=2114 题意: 求树上距离为k的点对数量: 思路: 点分治.. 实现代码: #include<iostream> #includ ...
- poj 2104 (划分树模板)
Description You are working for Macrohard company in data structures department. After failing your ...
- POJ 2114 Boatherds 树分治
Boatherds Description Boatherds Inc. is a sailing company operating in the country of Trabantust ...
- poj 2114 Boatherds 树的分治
还是利用点的分治的办法来做,统计的办法不一样了,我的做法是排序并且标记每个点属于哪颗子树. #include <iostream> #include <cstdio> #inc ...
- POJ 2114 - Boatherds
原题地址:http://poj.org/problem?id=2114 题目大意: 给定一棵点数为\(n~(n \le 10000)\)的无根树,路径上有权值,给出m组询问($m \le 100$), ...
- POJ 2114 Boatherds【Tree,点分治】
求一棵树上是否存在路径长度为K的点对. POJ 1714求得是路径权值<=K的路径条数,这题只需要更改一下统计路径条数的函数即可,如果最终的路径条数大于零,则说明存在这样的路径. 刚开始我以为只 ...
- Poj 2114 Boatherds(点分治)
Boatherds Time Limit: 2000MS Memory Limit: 65536K Description Boatherds Inc. is a sailing company op ...
- [划分树] POJ 2104 K-th Number
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 51732 Accepted: 17722 Ca ...
- POJ 2761 Feed the dogs(平衡树or划分树or主席树)
Description Wind loves pretty dogs very much, and she has n pet dogs. So Jiajia has to feed the dogs ...
随机推荐
- 大约cocos2d-X 3.x使用引擎版本自带的物理引擎Physics
今天打算用BOX2D物理引擎, 我想我以前听说过一些时间cocos2d-X在3.0版本封装自己的物理引擎Physics, 听名字很霸气量, 这的确是一个比BOX2D非常多( 毕竟是基于BOX2D封装的 ...
- NET 中的多线程
NET 中的多线程 为什么使用多线程 使用户界面能够随时相应用户输入 当某个应用程序在进行大量运算时候,为了保证应用程序能够随时相应客户的输入,这个时候我们往往需要让大量运算和相应用户输入这两个行为在 ...
- Class撑起了OOP世界的天。Class类是OO的基本单元,OO的世界都是通过一个一个的类协作完成的,提高软件的重用性、灵活性和扩展性(转)
引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的“社会”关系,从而让我们抛弃书上的那些死记硬背的概 ...
- 【三】注入框架RoboGuice使用:(Your First Resource Injection)
上一篇我们简单的介绍了一下RoboGuice的使用([二]注入框架RoboGuice使用:(Your First View Injection)),今天我们来看下资源文件的使用注解的方法: 为了在Ac ...
- Unity带有网络功能——创建服务,并连接到一个特定的服务
游戏本身需要在网络上创建服务,然后其他的游戏能够连接到这个服务,此外真实场景现在玩同样的游戏效果一起. 该方法是创建一个服务呼叫Network.InitializeServer( ): 是Networ ...
- hdu3480二维斜率优化DP
Division Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 999999/400000 K (Java/Others) Tota ...
- mvc与My97DatePicker插件的结合
Razor视图引擎与My97DatePicker插件的结合 1 using System; 2 using System.Collections.Generic; 3 using System.Run ...
- Windows Phone获取WiFi BSSID
原文:Windows Phone获取WiFi BSSID BSSID,一种特殊的Ad-hoc LAN的应用,也称为Basic Service Set (BSS),一群计算机设定相同的BSS名称,即可自 ...
- kd-tree注解 & bzoj 2648 & 2716 & 3053 解决问题的方法
[KD-TREE简介]于SYC1999大神"迷住"下一个.我开始接触这样的算法. 首先.这个概念大概能去百度百科.详细的实施.我在看RZZ的代码长大的. 我们能够想象在平面上有N个 ...
- Linux 编程学习笔记----动笔makefile档
Befroe Beginning. 在设置暑假的plan ,关于Linux的书籍如今在看的是ALP和Linux高级程序设计(杨宗德)第三版.在计划中的是Linux高级环境编程. 如今開始关于Linux ...