poj2114 Boatherds
Description
The pricing policy of the Boatherds is very simple: each segment of each river between two villages is assigned a price (the price is same in both directions), so if a tourist requests a journey between any two villages, the ticket office clerks just add the prices of the segments along the only path between the villages.
One day, a very strange tourist appeared. She told the clerks that she returns to her country on the next day and she wants to spend all the remaining money on a boat trip, so they should find a route with exactly this cost. Being just poor (ahem) businessmen, they have asked the Abacus Calculator Makers for help.
You are given a description of the river network with costs of river segments and a sequence of integers x1,..., xk. For each xi, you should determine if there is a pair of cities (a, b) in the river network such that the cost of the trip between a and b is exactly xi.
Input
- A single line containing a single integer: the number of villages N (1 <= N <= 10 000).
- N lines describing the villages. The i-th of these lines (1 <= i <= N) describes the village with number i. It contains space separated integers d1, c1, d2, c2, , dki, cki, 0. The dj's are numbers of villages from which the rivers flow directly to the village i (with no other villages in between), each cj is the price of the journey between villages i and dj. Moreover, 2 <= dj <= N and 0 <= cj <= 1 000. Village 1 always corresponds to the mouth of the largest river, therefore no di can ever be equal to 1.
- M <= 100 lines describing the queries. The i-th of these lines corresponds to the i-th query and contains a single integer xi (1 <= xi <= 10 000 000).
- The instance is finished by a single line containing the number 0.
The whole input is ended by a single line containing the number 0.
Output
Output for each instance must be followed by a single line containing just the dot character.
Sample Input
6
2 5 3 7 4 1 0
0
5 2 6 3 0
0
0
0
1
8
13
14
0
0
Sample Output
AYE
AYE
NAY
AYE
. 询问树上有没有长度为k的路径……对于询问一个一个点分治……反正n才10000m才100
输入好蛋疼……第一行n,接下来n行,每两个数ci、di,表示i和ci有长度为di的边,以0结束。接下来输入询问,以0结束。又有多组数据,以0结束
#include<cstdio>
#include<iostream>
#include<cstring>
#define LL long long
#define N 40010
#define mod 10207
using namespace std;
inline LL read()
{
LL x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct edge{int to,next,v;}e[2*N];
struct hashing{int v,next;}hash[2*N];
int he[N],head[N];
int f[N],son[N],s[N],d[N],query[N];
bool vis[N],ok[N];
int n,m,cnt,tot,root,sum,len,ans;
inline void ins(int u,int v,int w)
{
e[++cnt].to=v;
e[cnt].v=w;
e[cnt].next=head[u];
head[u]=cnt;
}
inline void insert(int u,int v,int w)
{
ins(u,v,w);
ins(v,u,w);
}
inline void inh(int u)
{
int w=u%mod+132;
hash[++tot].v=u;
hash[tot].next=he[w];
he[w]=tot;
}
inline bool fnd(int u)
{
if (u<0)return 0;
int w=u%mod+132;
for (int i=he[w];i;i=hash[i].next)
if (u==hash[i].v)return 1;
return 0;
}
inline void getroot(int x,int fa)
{
son[x]=1;f[x]=0;
for (int i=head[x];i;i=e[i].next)
if (fa!=e[i].to&&!vis[e[i].to])
{
getroot(e[i].to,x);
son[x]+=son[e[i].to];
f[x]=max(f[x],son[e[i].to]);
}
f[x]=max(f[x],sum-son[x]);
if (f[x]<f[root])root=x;
}
inline void dfs(int x,int fa)
{
s[++len]=d[x];
for (int i=head[x];i;i=e[i].next)
if (!vis[e[i].to]&&fa!=e[i].to)
{
d[e[i].to]=d[x]+e[i].v;
dfs(e[i].to,x);
}
}
inline void solve(int x)
{
vis[x]=1;tot=0;
memset(he,0,sizeof(he));inh(0);
for (int i=head[x];i;i=e[i].next)
if (!vis[e[i].to])
{
len=0;
d[e[i].to]=e[i].v;
dfs(e[i].to,0);
for (int j=1;j<=m;j++)
{
if (ok[j])continue;
for (int k=1;k<=len;k++)
if (fnd(query[j]-s[k]))
{
ok[j]=1;
break;
}
}
for (int j=1;j<=len;j++)inh(s[j]);
}
for (int i=head[x];i;i=e[i].next)
if (!vis[e[i].to])
{
sum=son[e[i].to];
root=0;
getroot(e[i].to,0);
solve(root);
}
}
inline void work()
{
memset(head,0,sizeof(head));
memset(vis,0,sizeof(vis));
memset(ok,0,sizeof(ok));
cnt=ans=0;
for(int i=1;i<=n;i++)
{
int x=read(),y;
while (x)
{
y=read();
insert(i,x,y);
x=read();
}
}
m=0;
int xx=read();
while (xx)
{
query[++m]=xx;
xx=read();
}
f[0]=n+1;sum=n;root=0;
getroot(1,0);
solve(root);
for (int i=1;i<=m;i++)
if (ok[i])printf("AYE\n");else printf("NAY\n");
printf(".\n");
}
int main()
{
while (~scanf("%d",&n)&&n)work();
}
poj2114 Boatherds的更多相关文章
- 【点分治】poj1741 Tree / poj2114 Boatherds / poj1987 Distance Statistics
三道题都很类似.给出1741的代码 #include<cstdio> #include<algorithm> #include<cstring> using nam ...
- 树链剖分-点的分治(dis[i]+dis[j]==k的点对数量)
poj2114 Boatherds Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1195 Accepted: 387 ...
- 【poj2114】 Boatherds
http://poj.org/problem?id=2114 (题目链接) 题意 给出一棵树,问是否存在两点间的距离为K. Solution 点分治嘛,跟poj1741差不多.. 然而为什么我调了一个 ...
- 【POJ2114】Boatherds 树分而治之
做广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog. ...
- POJ 2114 Boatherds 树分治
Boatherds Description Boatherds Inc. is a sailing company operating in the country of Trabantust ...
- 【poj2114】点分治(离线)
boatherds 2s 64M by czy 求一颗树上距离为K的点对是否存在 输入数据 n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接下来m行每行询问一个K 输出数据 对于每 ...
- Poj 2114 Boatherds(点分治)
Boatherds Time Limit: 2000MS Memory Limit: 65536K Description Boatherds Inc. is a sailing company op ...
- 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的路径条数,这题只需要更改一下统计路径条数的函数即可,如果最终的路径条数大于零,则说明存在这样的路径. 刚开始我以为只 ...
随机推荐
- ios将一个项目完全导为另一个项目(tool)
--前言:有时开始一个新项目,但新项目跟已做完的一个项目很类似,基本可以在原有项目上更改.这个时候,可以new一个新project,在将相应的代码文件copy到新的project,配置工程各参数,库等 ...
- [Redux] Implementing Store from Scratch
Learn how to build a reasonable approximation of the Redux Store in 20 lines. No magic! const counte ...
- Sandcastle Help File Builder使用教程
Sandcastle Help File Builder相信很多的园友用过,小弟我最近因为工作原因需要生成公司的一套SDK的帮助文档,因此找了一些资料,发现网上的资料很多,但是都不怎么完全,有些只是随 ...
- 一个好用的Python备份mysql的脚本
前几天打算用Python写一个mysql脚本,上Google看了下老外写的,写的挺好的,原地址在http://tecadmin.net/python-script-for-mysql-database ...
- 计算方法(二)用C#实现数值积分
在工程中,经常会遇到积分问题,这时原函数往往都是找不到的,因此就需要用计算方法的数值积分来求. public class Integral { /// <summary> /// 梯形公式 ...
- GDI+基础(3)
常用图形绘制 <%@ Page ContentType="image/gif" Language="C#" %> <!--ContentTyp ...
- .net面试总结
一. hr 为人处事 工作中遇到问题:沟通很重要 离职原因:公司倒闭 二. ISAPI Internet Server Application Program Interface 三. http状态码 ...
- gis基本概念之"投影变换"-浅谈
目录 1,概述 2,常用的投影方法有 正解变换 反解变换 数值变换 3,定义投影 4,投影变换 1,栅格(投影变换) 2,要素(投影变换) 注意 1,概述 因为GIS描述的是位于地球表面的信息,所以根 ...
- timestamp 正常日期转换成时间戳格式
select cast(sysdate as timestamp) "DATE" from dual select to_timestamp(to_date(sysdate, 'y ...
- rtsp转发服务器设计
做一个设备实时监控.需求是这样的,一个用户有多个设备(android系统,支持摄像头),设备分布在家中或者其它地方:用户可以远程通过终端(手机.pc.ipad,etc...)管理操纵这些设备(包括实时 ...