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. pktgen-dpdk 运行 run.py 报错 Config file 'default' not found 解决方法

    pktgen 操作手册:http://pktgen-dpdk.readthedocs.io/en/latest/getting_started.html 执行到这一步时: $ cd <Pktge ...

  2. 学习总结:jQuery插件开发模式和结构

    学习博客链接: ①https://www.cnblogs.com/cyStyle/ ② https://www.cnblogs.com/chengyunshen/p/7277305.html ③ ht ...

  3. 带复杂类的list,list<class>前台往后台传输

    1.前台 $("#applyGoods").click(function(){ var usid=$(this).next().text(); var aid=$(this).ne ...

  4. Mysql Group Replication 简介及单主模式组复制配置【转】

    一 Mysql Group Replication简介    Mysql Group Replication(MGR)是一个全新的高可用和高扩张的MySQL集群服务.    高一致性,基于原生复制及p ...

  5. JS单例模式在工作中的使用

    为了尽可能的减少全局变量的污染,在写js的时候可以采用单例模式,形式如下: 比如有一个js叫demo.js,那么我们可以在js里这样写: var demo = {} 这样做的目的是将整个js当成一个对 ...

  6. gitlab账号注册及分组

    .开启注册邮箱验证 admin area -->setting-->Sign-up restrictions-->勾选Send confirmation email on sign- ...

  7. [转帖]Kerberos简介

    1.  Kerberos简介 https://www.cnblogs.com/wukenaihe/p/3732141.html 1.1. 功能 一个安全认证协议 用tickets验证 避免本地保存密码 ...

  8. php父级目录文件包函问题

    问题: php子目录不能包函父目录中的文件. 环境: 网站根目录:/var/www/html/ PHP版本: 5.3.3 Apache版本:2.2 好了,创建三个文件: //文件路径:/var/www ...

  9. javascript易混淆的split()、splice()、slice()方法详解

    很多时候,一门语言总有那么些相似的方法,容易让人傻傻分不清楚,尤其在不经常用的时候.而本文主要简单总结了JavaScript中的关于字符串和数组中三个容易混淆的方法.旨在方便查阅,在容易混淆的时候有据 ...

  10. nowcoder 203A Knight(贪心+打表)

    题目链接 题目描述 有一张无限大的棋盘,你要将马从(0,0)移到(n,m). 每一步中,如果马在(x,y),你可以将它移动到(x+1,y+2),(x+1,y-2),(x-1,y+2),(x-1,y-2 ...