博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
树链剖分-点的分治(dis[i]+dis[j]==k的点对数量)
阅读量:4886 次
发布时间:2019-06-11

本文共 5946 字,大约阅读时间需要 19 分钟。

Boatherds
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 1195   Accepted: 387

Description

Boatherds Inc. is a sailing company operating in the country of Trabantustan and offering boat trips on Trabantian rivers. All the rivers originate somewhere in the mountains and on their way down to the lowlands they gradually join and finally the single resulting river flows to the sea. Moreover, the Trabantian villages are exactly at the rivers' springs, junctions and at the mouth of the largest river. Please note that more than 2 rivers can join at a junction. However, the rivers always form a tree (with villages as vertices). 
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

The input consists of several instances. Each instance is described by (in the following order): 
  • 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

For each instance you should produce a sequence of M lines (where M is the number of queries in the particular instance). The i-th of these lines contains the word "AYE" if there exists a pair of cities in the river network which is connected by a path of cost xi, or the word "NAY" otherwise. 
Output for each instance must be followed by a single line containing just the dot character. 

Sample Input

62 5 3 7 4 1 005 2 6 3 000018131400

Sample Output

AYEAYENAYAYE.
题目大意:

求一棵树上是否存在路径长度为K的点对。

求得是路径权值<=K的路径条数,这题只需要更改一下统计路径条数的函数即可,如果最终的路径条数大于零,则说明存在这样的路径。

刚开始我以为只要在分治过程中出现过长度为K的就算是找到了,其实不然,因为可能是相同子树里面的两个结点,这个结果显然是错误的。

修改内容:例如一个序列0,1,2,2,3,3,3,4,4,4,6,8,9

设k=6对于该子树,先找到0,1,2,2,3,3,3,4,4,4,6,sum+=1*1,

然后:搜到2,2,3,3,3,4,4,4,sum+=2*3(2个2与3个4)

最后搜到3,3,3,sum+=3*2/2;

return sum=9;

程序:

#include"string.h"#include"stdio.h"#include"stdlib.h"#include"queue"#include"stack"#include"iostream"#include"algorithm"#include"vector"#define inf 1000000000#define M 51111using namespace std;struct node{    int u,v,w,next;}edge[M*3];int t,head[M],use[M],dis[M],son[M],limit[M],k,cnt,MN,ID,ans;void init(){    t=0;    memset(head,-1,sizeof(head));}void add(int u,int v,int w){    edge[t].u=u;    edge[t].v=v;    edge[t].w=w;    edge[t].next=head[u];    head[u]=t++;}void dfs_size(int u,int f){    son[u]=1;    limit[u]=0;    for(int i=head[u];i!=-1;i=edge[i].next)    {        int v=edge[i].v;        if(f!=v&&!use[v])        {            dfs_size(v,u);            son[u]+=son[v];            limit[u]=max(limit[u],son[v]);        }    }}void dfs_root(int root,int u,int f){    if(son[root]-son[u]>limit[u])        limit[u]=son[root]-son[u];    if(MN>limit[u])    {        ID=u;        MN=limit[u];    }    for(int i=head[u];i!=-1;i=edge[i].next)    {        int v=edge[i].v;        if(f!=v&&!use[v])            dfs_root(root,v,u);    }}void dfs_dis(int u,int f,int id){    for(int i=head[u];i!=-1;i=edge[i].next)    {        int v=edge[i].v;        if(f!=v&&!use[v])        {            dfs_dis(v,u,id+edge[i].w);        }    }    dis[cnt++]=id;}int cal(int u,int f,int id){    cnt=0;    int sum=0,i,j;    dfs_dis(u,f,id);    sort(dis,dis+cnt);    i=0;    j=cnt-1;    while(i
k) j--; else { if(dis[i]==dis[j]) { sum+=(j-i+1)*(j-i)/2; break; } int st=i,ed=j; while(dis[st]==dis[i])st++; while(dis[ed]==dis[j])ed--; sum+=(st-i)*(j-ed); i=st,j=ed; } } return sum;}void dfs_ans(int root,int u,int f){ dfs_size(root,f); MN=inf; dfs_root(root,root,f); ans+=cal(ID,ID,0); use[ID]=1; for(int i=head[ID];i!=-1;i=edge[i].next) { int v=edge[i].v; if(!use[v]) { ans-=cal(v,v,edge[i].w); dfs_ans(v,v,v); } }}void slove(){ ans=0; memset(use,0,sizeof(use)); dfs_ans(1,1,1); //printf("%d\n",ans); if(ans>0) printf("AYE\n"); else printf("NAY\n");}int main(){ int n,i,j,w; while(scanf("%d",&n),n) { init(); for(i=1;i<=n;i++) { while(scanf("%d",&j),j) { scanf("%d",&w); add(i,j,w); add(j,i,w); } } while(scanf("%d",&k),k) { slove(); } printf(".\n"); } return 0;}

转载于:https://www.cnblogs.com/mypsq/p/4348205.html

你可能感兴趣的文章
LOG收集系统(一):原日志至收集
查看>>
Logstash连接Elasticsearch异常
查看>>
用户交互程序,格式化输出
查看>>
SPOJ PT07X Vertex Cover
查看>>
$ python-json模块的基本用法
查看>>
5.6.3.4 trim()方法
查看>>
SQL演练
查看>>
React Antd中样式的修改
查看>>
Spring 应用外部属性文件 配置 context 错误
查看>>
导入lxml找不到etree,报ImportError:DLL load failed:找不到指定的程序
查看>>
面向对象一
查看>>
大象的崛起!Hadoop七年发展风雨录
查看>>
图片二值化
查看>>
数据库常用函数
查看>>
集合之TreeSet(含JDK1.8源码分析)
查看>>
C语言学习的记忆
查看>>
Lucene学习总结之三:Lucene的索引文件格式(1) 2014-06-25 14:15 1124人阅读 ...
查看>>
Python:GeoJson格式的多边形裁剪Tiff影像并计算栅格数值
查看>>
免费下载知网文献的方法 | sci-hub免费下载SCI论文方法
查看>>
测试用例,变量之间,相互调用的方法,和修改原来初始化变量的方法
查看>>