时间限制: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)

输入例子:
3
1 2
1 3
2
1 3
1 2
输出例子:
3
5

-->

示例1

输入

3
1 2
1 3
2
1 3
1 2

输出

3
5



#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+88;
long long ans[N];
int tot,head[N],pos[N],kt,lt[N];
struct cta{
 int next,to,w;
}e[N<<1];
struct node{
 int num,l,r;
 long long sum;
}tr[N<<2];
struct qqq{
 int id,rto;
 long long k;
 bool operator <(const qqq &A)const{
 return k>A.k;
 }
}qt[N];
struct ttt{
 long long dis;
 int id;
 bool operator < (const ttt &B)const{
   return dis>B.dis;
 }
}dt[N];
void add(int u,int v,int w) {
 e[tot].to=v;e[tot].next=head[u];e[tot].w=w;head[u]=tot++;
}
void build(int l,int r,int rt){
 tr[rt].l=l,tr[rt].r=r;
 tr[rt].sum=tr[rt].num=0;
 if(l==r) return;
 int mid=(l+r)>>1;
 build(l,mid,rt<<1);
 build(mid+1,r,rt<<1|1);
}
void dfs(int u,long long now,int f){
 pos[u]=++kt;
 for(int i=head[u];~i;i=e[i].next)  {
 if(e[i].to==f) continue;
 else dfs(e[i].to,dt[e[i].to].dis=e[i].w+now,u);
 }
 lt[u]=kt;
}
void modify(int pos,int rt,int cc){
 int l=tr[rt].l,r=tr[rt].r;
 int mid=(l+r)>>1;
 if(l==r) {
  tr[rt].num=1;
  tr[rt].sum+=dt[cc].dis;
     return;}
 if(pos<=mid) modify(pos,rt<<1,cc);
 else modify(pos,rt<<1|1,cc);
 tr[rt].num=tr[rt<<1].num+tr[rt<<1|1].num;
 tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
}
long long query(int L,int R,int rt,long long &cty){
 long long now=0;
 if(L>R) return 0;
 int l=tr[rt].l,r=tr[rt].r;
 if(L<=l&&R>=r) {cty+=tr[rt].num; return tr[rt].sum;}
 int mid=(l+r)>>1;
 if(mid>=L) now+=query(L,R,rt<<1,cty);
 if(mid<R) now+=query(L,R,rt<<1|1,cty);
 return now;
}
int tran[N];
int main(){
 int n,x,y,m;
 memset(head,-1,sizeof(head));
 tot=kt=0;
 scanf("%d",&n);
 build(1,n,1);
 for(int i=2;i<=n;++i) {
  scanf("%d%d",&x,&y);
  add(x,i,y);
  add(i,x,y);
 }
 dfs(1,0,0);
 for(int i=1;i<=n;++i) dt[i].id=i;
 scanf("%d",&m);
 for(int i=1;i<=m;++i) {
  scanf("%d%lld",&qt[i].rto,&qt[i].k);
  qt[i].id=i;
  qt[i].k+=dt[qt[i].rto].dis;
 }
 sort(qt+1,qt+1+m);
 sort(dt+1,dt+n+1);
 int r=1;
 for(int i=1;i<=n;++i) tran[dt[i].id]=i;
 for(int i=1;i<=m;++i) {
     long long now=0;
     for(;r<=n;++r) if(!(dt[r].dis>=qt[i].k)) break;else modify(pos[dt[r].id],1,r);
     ans[qt[i].id]=query(pos[qt[i].rto]+1,lt[qt[i].rto],1,now);
     ans[qt[i].id]-=now*dt[tran[qt[i].rto]].dis;
 }
 for(int i=1;i<=m;++i) printf("%lld\n",ans[i]);
}

wannafly挑战赛4树的距离 离线处理,dfs序的更多相关文章

  1. newcoder Wannafly挑战赛4 树的距离

    https://www.nowcoder.com/acm/contest/35/D 假设要查询x的子树中,与x的距离>=y的距离和 那么如果有这么一个 由x的子树中的点到x的距离构成的序列,且按 ...

  2. 【bzoj4771】七彩树 树链的并+STL-set+DFS序+可持久化线段树

    题目描述 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i]=c[j],那么我们认为点i和点j拥有相同的颜色.定义 ...

  3. Bzoj 4034: [HAOI2015]T2 树链剖分,子树问题,dfs序

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1841  Solved: 598[Submit][Status] ...

  4. BZOJ4530 BJOI2014大融合(线段树合并+并查集+dfs序)

    易知所求的是两棵子树大小的乘积.先建出最后所得到的树,求出dfs序和子树大小.之后考虑如何在动态加边过程中维护子树大小.这个可以用树剖比较简单的实现,但还有一种更快更优美的做法就是线段树合并.对每个点 ...

  5. bzoj4817/luogu3703 树点涂色 (LCT+dfs序+线段树)

    我们发现,这个染色的操作他就很像LCT中access的操作(为什么??),然后就自然而然地想到,其实一个某条路径上的颜色数量,就是我们做一个只有access操作的LCT,这条路径经过的splay的数量 ...

  6. BZOJ.4817.[SDOI2017]树点涂色(LCT DFS序 线段树)

    题目链接 操作\(1.2\)裸树剖,但是操作\(3\)每个点的答案\(val\)很不好维护.. 如果我们把同种颜色的点划分到同一连通块中,那么向根染色的过程就是Access()! 最初所有点间都是虚边 ...

  7. 沈阳网络赛J-Ka Chang【分块】【树状数组】【dfs序】

    Given a rooted tree ( the root is node 11 ) of NN nodes. Initially, each node has zero point. Then, ...

  8. 【AC自动机】【树状数组】【dfs序】洛谷 P2414 [NOI2011]阿狸的打字机 题解

        这一题是对AC自动机的充分理解和树dfs序的巧妙运用. 题目背景 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. 题目描述 打字机上只有28个按键,分别印有26个小写英文字母和' ...

  9. 【树链剖分】【dfs序】【线段树】bzoj2836 魔法树

    这道题告诉我们:树链剖分的重标号就是dfs序. #include<cstdio> #include<algorithm> using namespace std; #defin ...

随机推荐

  1. HashMap源码解析JDK8

    一.HashMap基础 1.1 HashMap的定义 我们先看一下HashMap的定义: public class HashMap<K,V> extends AbstractMap< ...

  2. Linux 设置秘钥登录(SSH免密连接)

    Secure Shell 协议,简称 SSH,是一种加密网络协议,用于客户端和主机之间的安全连接,并支持各种身份验证机制,目前最实用的身份验证机制就是基于密码的身份验证和基于公钥的身份验证两种.Lin ...

  3. history of program atan2(y,x)和pow(x,y)

    编年史 1951 – Regional Assembly Language 1952 – Autocode 1954 – IPL (LISP语言的祖先) 1955 – FLOW-MATIC (COBO ...

  4. 对话Roadstar投资人:一家自动驾驶公司之死(三) ...

    11. Roadstar 如何收场? 雷锋网:你觉得 Roadstar 造成今天这样的局面,是什么导致的? 投资人代表 1:刚才我们也数次表达了,在每个人身上,可能每个人的诉求,不能达到同步,与公司的 ...

  5. Firefox 66 发布,阻止网站自动播放声音

    Firefox 66 发布了,此版本在桌面版中带来的新特性包括: Firefox 现在阻止网站自动播放声音,如果需要可以单独调整 改进的搜索体验: 当打开许多选项卡时,可以更快地查找特定网页:现在可以 ...

  6. Bubble Cup 11 - Finals [Online Mirror, Div. 1]题解 【待补】

    Bubble Cup 11 - Finals [Online Mirror, Div. 1] 一场很好玩的题啊! I. Palindrome Pairs 枚举哪种字符出现奇数次. G. AI robo ...

  7. Redis(一):数据结构与对象

    前言 本书是Redis设计与实现的读书笔记,旨在对Redis底层的数据结构及实现有一定了解.本书所有的代码基于Redis 3.0. 简单动态字符串 SDS Redis没有直接使用C语言中的字符串,而是 ...

  8. Codeforces Round #590

    题目链接:Round #590 题目答案:官方Editorial.My Solution A. Equalize Prices Again 签到题还WA了一发,向上取整有点问题: //my wrong ...

  9. USACO Training Section 1.2 [USACO1.2]方块转换 Transformations

    题目描述 一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案.写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式: 1:转90度:图案按顺时针 ...

  10. spring的aop的注解配置

    一.使用注解的方式配置后置通知 第一步,创建通知类LogAdvice 第二步,要在spring主配置文件中声明以注解的方式配置spring aop  第三步,测试 二.其他异常配置 package c ...