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. Mongodb compass 介绍

    参考官方文档:https://docs.mongodb.com/compass/current/install/#install-on-red-hat-enterprise-linux-rhel Mo ...

  2. 2D变换

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. Linux基础五(系统管理)

    Linux 系统管理 1. 进程管理 1.1 进程管理简介 进程的简介: 一个程序在运行的时候会占用系统的资源,即系统分配资源给某个程序使用,进程就是正在运行中的某个程序或者命令.进程又可以细分为线程 ...

  4. java传统的文件拷贝 相当于两个大缸需要通过一个勺子(字节数组)一点一点运过去

  5. Ubuntu 12.04下LAMP环境搭建实录

    方法一: 用tasksel可以方便安装dns server, lamp, kubuntu desktop, ubuntu desktop, xubuntu之类的软件包.这个软件在ubuntu serv ...

  6. div内元素的居中

    1.如果是一行文字(不超过一行) parent{ text-align:center; line-height:div高度; } 2.如果是div内其他类型元素 parent{ height:xxxp ...

  7. 【刷题】BZOJ 2346 [Baltic 2011]Lamp

    Description 2255是一个傻X,他连自己家灯不亮了都不知道. 某天TZ大神路过他家,发现了这一情况, 于是TZ开始行侠仗义了. TZ发现是电路板的问题, 他打开了电路板,发现线路根本没有连 ...

  8. Java并发编程中线程池源码分析及使用

    当Java处理高并发的时候,线程数量特别的多的时候,而且每个线程都是执行很短的时间就结束了,频繁创建线程和销毁线程需要占用很多系统的资源和时间,会降低系统的工作效率. 参考http://www.cnb ...

  9. 【BZOJ1011】遥远的行星(???)

    题面 BZOJ 洛谷 题解 大概就是分个块,然后每块取平均数算贡献啥的. BZOJ上过不去??? #include<iostream> #include<cstdio> usi ...

  10. 前端学习 -- 内联框架iframe

    内联框架iframe 可以向一个页面中引入其他的外部页面 内联框架中的内容不会被搜索引擎所检索,所以开发中尽量不要使用内联框架 <iframe></iframe> 属性: sr ...