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. c++ imooc自学计划

    一.视频学习相关的课程列表: C++远征之起航篇http://www.imooc.com/learn/342: C++远征之离港篇http://www.imooc.com/learn/381: C++ ...

  2. win10频繁提示证书即将过期怎么办

    最近几天每次开机都会提示许可证即将过期 ”Windows+R”打开“运行”窗口,输入“slmgr.vbs -xpr”并点击“确定”,弹出的窗口确实显示过期时间在本月1.29过期 百度各种激活方法后,发 ...

  3. 补发9.28“天天向上”团队Scrum站立会议

    组长:王森 组员:张金生 张政 栾骄阳 时间:2016.09.28 地点:612寝 组员 已完成 未完成 王森 搭建初步原型 完善原型 张金生 更新UI设计 生成应用界面原型 张政 初步设计框架图 完 ...

  4. Oracle 数据库备份启用压缩以及remap

    1. Oracle数据库进行备份恢复 客户测试环境, 有时候需要从现场copy到公司, 压缩虽然能够减少部分空间大小,但是copy到虚拟机里面也时浪费很大量的磁盘,所以能够在备份恢复的过程中执行压缩最 ...

  5. Java的StringBuIlder扩容机制

    JDK 1.6中,扩容的源码是这样: void expandCapacity(int minimumCapacity) { int newCapacity = (value.length + 1) * ...

  6. DAY...

    讲道理,我还是以前的我.没有坚持每天写......... 又到了谷底......... 坚持啊........

  7. BZOJ2958 序列染色(动态规划)

    令f[i][0/1/2][0/1]表示前i位,不存在满足要求的B串和W串/存在满足要求的B串不存在W串/存在满足要求的B串和W串,第i位填的是B/W的方案数.转移时考虑连续的一段填什么.大讨论一波后瞎 ...

  8. 【刷题】洛谷 P4234 最小差值生成树

    题目描述 给定一个标号为从 \(1\) 到 \(n\) 的.有 \(m\) 条边的无向图,求边权最大值与最小值的差值最小的生成树. 输入输出格式 输入格式: 第一行两个数 \(n, m\) ,表示图的 ...

  9. 【CF739E】Gosha is hunting(动态规划,凸优化)

    [CF739E]Gosha is hunting(动态规划,凸优化) 题面 洛谷 CF 题解 一个\(O(n^3)\)的\(dp\)很容易写出来. 我们设\(f[i][a][b]\)表示前\(i\)个 ...

  10. 20135239 Linux内核分析 期中总结

    期中总结 链接 网易云课堂 MOOC 摘录与实验内容 第一周: http://www.cnblogs.com/20135239-yxlm/p/5216842.html 第二周: http://www. ...