https://www.nowcoder.com/acm/contest/35/D

假设要查询x的子树中,与x的距离>=y的距离和

那么如果有这么一个

由x的子树中的点到x的距离构成的序列,且按距离排好序,

那么在这个序列中,y之后的距离和就是答案

得到子树中按距离排好序的一段序列

按dfs序建立主席树即可

每次查询抽出x的子树序列,

注意主席树的权值是按点到根节点的距离

所以 查询dis[x]+y之后的距离和,再减去 x子树大小*dis[x]

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 200001 typedef long long LL; int n; int front[N],nxt[N<<],to[N<<],val[N<<]; int tot,TOT; int in[N],out[N],id[N]; LL has[N],dep[N]; int root[N],lc[N*],rc[N*],cnt[N*];
LL sum[N*]; LL ans; int num; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void add(int u,int v,int w)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; val[tot]=w;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; val[tot]=w;
} void predfs(int x,int y)
{
in[x]=++tot; id[tot]=x;
for(int i=front[x];i;i=nxt[i])
if(to[i]!=y) dep[to[i]]=has[to[i]]=dep[x]+val[i],predfs(to[i],x);
out[x]=tot;
} void insert(int &x,int y,int l,int r,int pos)
{
x=++tot;
sum[x]=sum[y]+has[pos]; cnt[x]=cnt[y]+;
if(l==r) return;
int mid=l+r>>;
if(pos<=mid) rc[x]=rc[y],insert(lc[x],lc[y],l,mid,pos);
else lc[x]=lc[y],insert(rc[x],rc[y],mid+,r,pos);
} void build()
{
sort(has+,has+n+);
TOT=unique(has+,has+n+)-has-;
tot=;
for(int i=;i<=n;++i)
insert(root[i],root[i-],,TOT,lower_bound(has+,has+TOT+,dep[id[i]])-has);
} void query(int x,int y,int l,int r,int pos)
{
if(l==r)
{
ans+=sum[x]-sum[y];
num+=cnt[x]-cnt[y];
return;
}
int mid=l+r>>;
if(pos<=mid)
{
ans+=sum[rc[x]]-sum[rc[y]];
num+=cnt[rc[x]]-cnt[rc[y]];
query(lc[x],lc[y],l,mid,pos);
}
else query(rc[x],rc[y],mid+,r,pos);
} int main()
{
freopen("data.in","r",stdin);
freopen("my.out","w",stdout);
int x,y;
read(n);
for(int i=;i<n;++i)
{
read(x); read(y);
add(i+,x,y);
}
tot=;
predfs(,);
build();
int m,pos;
read(m);
while(m--)
{
read(x); read(y);
pos=lower_bound(has+,has+TOT+,dep[x]+y)-has;
if(pos>TOT) puts("");
else
{
ans=; num=;
query(root[out[x]],root[in[x]-],,TOT,pos);
cout<<ans-num*dep[x]<<'\n';
}
}
}
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

wyf非常喜欢树。一棵有根数树上有N个节点,1号点是他的根,每条边都有一个距离,而wyf是个爱问奇怪问题的熊孩子,他想知道对于某个点x,以x为根的子树上,所有与x距离大于等于k的点与x的距离之和。

输入描述:

第一行一个正整数N

接下来N-1描述这棵树,每行两个数第i行两个数p和D表示树上有一条p到i+1长度为D的边。(p<=i)

下面一行一个正整数Q表示wyf的询问次数。

接下来Q行每行两个正整数x和k。 (1<=N,Q<=2x105,1<=D,K<=106)

输出描述:

对于每次询问x,k输出以x为根的子树上,所有与x距离大于等于k的点与x的距离之和。(若不存在这样的点,则输出应为0)
示例1

输入

3
1 2
1 3
2
1 3
1 2

输出

3
5

newcoder Wannafly挑战赛4 树的距离的更多相关文章

  1. wannafly挑战赛4树的距离 离线处理,dfs序

    时间限制:C/C++ 2秒,其他语言4秒空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 wyf非常喜欢树.一棵有根数树上有N个节点, ...

  2. Wannafly挑战赛18 E 极差(线段树、单调栈)

    Wannafly挑战赛18 E 极差 题意 给出三个长度为n的正整数序列,一个区间[L,R]的价值定义为:三个序列中,这个区间的极差(最大值与最小值之差)的乘积. 求所有区间的价值之和.答案对\(2^ ...

  3. Wannafly挑战赛2_D Delete(拓扑序+最短路+线段树)

    Wannafly挑战赛2_D Delete Problem : 给定一张n个点,m条边的带权有向无环图,同时给定起点S和终点T,一共有q个询问,每次询问删掉某个点和所有与它相连的边之后S到T的最短路, ...

  4. 【Wannafly挑战赛29F】最后之作(Trie树,动态规划,斜率优化)

    [Wannafly挑战赛29F]最后之作(Trie树,动态规划,斜率优化) 题面 牛客 题解 首先考虑怎么计算\([l,r]\)这个子串的不同的串的个数. 如果\(l=1\),我们构建\(Trie\) ...

  5. 牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树)

    牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树) 链接:https://ac.nowcoder.com/acm/problem/15706 现在需要您来帮忙维护这个名册, ...

  6. Wannafly挑战赛27

    Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...

  7. Wannafly 挑战赛 19 参考题解

    这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...

  8. Wannafly挑战赛22游记

    Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...

  9. 【Wannafly挑战赛4】F 线路规划 倍增+Kruskal+归并

    [Wannafly挑战赛4]F 线路规划 题目描述 Q国的监察院是一个神秘的组织.这个组织掌握了整个帝国的地下力量,监察着Q国的每一个人.监察院一共有N个成员,每一个成员都有且仅有1个直接上司,而他只 ...

随机推荐

  1. HDU 4281 Judges' response 状压dp+多旅行商问题

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4281 Judges' response Time Limit: 2000/1000 MS (Java ...

  2. Results the mutual for the first time(alpha阶段总结)

    由于前天听大家的成果展时,做得笔记不够完善,有一两个组找不到信息,如果没有评到的组望谅解. 分数分配: 由于组内某些原因,我们现重新分组: 试用版: 总结前阶段的工作: 在前一段时间,我们第一个spr ...

  3. Internet 校验和的数学性质

    Internet 校验和(Checksum)仅计算头部的正确性,这一点很重要,这意味着 IP 协议不检查 IPv4 packet 有效载荷部分的数据正确性.为了保证有效载荷部分的正常传输,其他协议必须 ...

  4. 13_Java面向对象_第13天(static、final、匿名对象、内部类、包、修饰符、代码块)_讲义

    今日内容介绍 1.final 关键字 2.static 关键字 3.匿名对象 4.内部类 5.包的声明与访问 6.访问修饰符 7.代码块 01final关键字概念 A: 概述 继承的出现提高了代码的复 ...

  5. 13种细分类型的TCP重传小结(一张表总结4.4内核所有TCP重传场景)

    具体每种重传类型的wireshark示例解说参考前文 来自为知笔记(Wiz)

  6. 1014 C语言文法定义

    <程序>→<外部声明>|<程序><外部声明><外部声明>→<函数定义>|<声明><函数定义>→<数 ...

  7. Beta阶段——第一篇 Scrum 冲刺博客

    i. 提供当天站立式会议照片一张: ii. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 数据存储方式改本地存储为数据库存储. (2) 今天计划完成的工作: 账单和剩余舍 ...

  8. Android Service执行unbind后再次执行bind的问题

    在执行了startService.bindService.unbindService之后,再次执行bindService.这时发现Service的onBind方法并没有执行,而是执行的onRebind ...

  9. spring通过工厂模式解决页面耦合问题

    spring通过工厂模式解决页面耦合问题

  10. 对\${ctx}的一点理解

    一.\${ctx}与${pageContext.request.contextPath}的区别 相同点: \${ctx}和\${pageContext.request.contextPath}都是获取 ...