时间限制: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. CF1092 --- Tree with Maximum Cost

    CF1324 --- Maximum White Subtree 题干 You are given a tree consisting exactly of \(n\) vertices. Tree ...

  2. Hard filters (by GATK)

    Filter Symbol T. Definition QualByDepth QD 2.0 The variant confidence (from the QUAL field) divided ...

  3. CreateDIBSection和位图结构

    2019独角兽企业重金招聘Python工程师标准>>> 理解分辨率 我们常说的屏幕分辨率为640×480,刷新频率为70Hz,意思是说每行要扫描640个象素,一共有480行,每秒重复 ...

  4. Fibonacci Sequence

    0 递归 斐波那契数列定义: $F(n)=\left\{\begin{matrix}0, & n=0\\ 1, & n=1\\ F(n-1)+F(n-2), & n>1\ ...

  5. Codeforce 322E Ciel the Commander (点分治)

    E. Ciel the Commander Now Fox Ciel becomes a commander of Tree Land. Tree Land, like its name said, ...

  6. SSM框架完整开发流程

    ----------------第一阶段-------------- 1.数据库建模 2.生成sql语句 3.在mysq客户端使用命令方式执行sql脚本,生成数据库 4.允许远程访问mysql GRA ...

  7. Thinkphp 缓存RCE

     5.0.0<=ThinkPHP5<=5.0.10 .   漏洞利用条件: 1.基于tp5开发的代码中使用了Cache::set 进行缓存 2.在利用版本范围内 3.runtime目录可以 ...

  8. 学习vue第七节,filter过滤器如何的使用

    vue 过滤器如何的使用 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  9. msf的rpc和json-rpc,我该选择哪个?

    msf的rpc有两种调用方式,那么我们应该调用哪一个呢? 其中restful接口暂且不谈,这个rest api其实是简单对接了一下msf的后端数据库,这个自己也能读数据库来做,这个以后有时间再谈 首先 ...

  10. P2201 数列编辑器

    传送门呀呀呀呀呀呀呀呀呀呀呀呀呀 \(乍一看题目好像很难\)(实际也确实很难) \(但是我们仔细看就发现,整个数列分成了光标前和光标后两组数列\) \(我们有什么理由不分开储存呢??\) \(然后光标 ...