#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define per(i,j,k) for(int i=j;i>=k;i--)
#define LL long long
using namespace std;
const int maxx = 3e5+;
struct node{
int l,r;
LL val;
}tree[maxx<<];
int ver[maxx*],Next[maxx*],head[maxx];
///邻接表
int deapth[maxx],Size[maxx],dfn[maxx],root[maxx];
///深度数组 包含自己在内的子节点数目 DFS序 主席树的根
int tot,order,deep,cnt;
///边的序号 DFS序标记 最深深度
void add(int x,int y){
ver[++tot]=y;Next[tot]=head[x];head[x]=tot;
ver[++tot]=x;Next[tot]=head[y];head[y]=tot;
}
void inserts(int l,int r,int pre,int &now,int pos,LL val){
///动态开点部分
now=++cnt;
///把旧的节点的信息更新到新的节点上
tree[now]=tree[pre];
///维护前缀和
tree[now].val+=val;
if (l==r){
return;
}
int mid=(l+r)>>;
if (pos<=mid){
inserts(l,mid,tree[pre].l,tree[now].l,pos,val);
}else {
inserts(mid+,r,tree[pre].r,tree[now].r,pos,val);
}
}
LL query(int L,int R,int l,int r,int ql,int qr){
LL ans=;
///如果在范围内,直接返回
if (ql<=l && r<=qr){
return tree[R].val-tree[L].val;
}
int mid=(l+r)>>;
if(ql<=mid)ans+=query(tree[L].l,tree[R].l,l,mid,ql,qr);
if(qr>mid)ans+=query(tree[L].r,tree[R].r,mid+,r,ql,qr);
return ans;
}
void dfs1(int x,int fa){
Size[x]=;
deapth[x]=deapth[fa]+;
///更新最深是深度
deep=max(deep,deapth[x]);
for(int i=head[x];i;i=Next[i]){
if(ver[i]==fa)continue;
dfs1(ver[i],x);
Size[x]+=Size[ver[i]];
}
}
void dfs2(int x,int fa){
dfn[x]+=++order;
///这里注意,由于我们需要按照树的变量顺序来建立序列,所以应该是root[order-1],root[order]
///size减1是为了减去自己
inserts(,deep,root[order-],root[order],deapth[x],Size[x]-);
for (int i=head[x];i;i=Next[i]){
if(ver[i]==fa)continue;
dfs2(ver[i],x);
}
}
int main(){
int n,q;
int uu,vv,l,r;
while(~scanf("%d%d",&n,&q)){
order=;
deep=;
cnt=;
memset(Next,,sizeof(Next));
memset(Size,,sizeof(Size));
memset(dfn,,sizeof(dfn));
memset(deapth,,sizeof(deapth));
rep(i,,n-){
scanf("%d%d",&uu,&vv);
add(uu,vv);
}
dfs1(,);
dfs2(,);
LL ans=;
int p,k;
while(q--){
scanf("%d%d",&p,&k);
ans=;
///当a点在b点的的下面,那么b所处于的位置,应该是其a的深度和k当中小的那个
///因为b只会在a的上面k个位置,并且如果a的深度太小的话,其深度可能达不到k个
///C的位置的可能一定是a的子节点
ans+=(LL)(Size[p]-)*min(k,deapth[p]-);
///当b点在a的下端,那么c应该在b的子节点中
///所以我们要查询a也就是p的子节点中 所以第一个范围oot[dfn[p]-1],root[dfn[p]+Size[p]-1]
///查询其子节点中深度在deepth[p]+1到death[p]+k的节点中子节点的个数和
///因为我们构架线段树的时候,构建的是前缀和
ans+=query(root[dfn[p]-],root[dfn[p]+Size[p]-],,deep,deapth[p]+,min(deapth[p]+k,deep));
if (deapth[p]==deep)ans=;
printf("%lld\n",ans);
}
}
return ;
}

P3899 [湖南集训]谈笑风生 主席树的更多相关文章

  1. [Luogu P3899] [湖南集训]谈笑风生 (主席树)

    题面 传送门:https://www.luogu.org/problemnew/show/P3899 Solution 你们搞的这道题啊,excited! 这题真的很有意思. 首先,我们可以先理解一下 ...

  2. luogu P3899 [湖南集训]谈笑风生 线段树合并

    Code: #include<bits/stdc++.h> #define maxn 300002 #define ll long long using namespace std; vo ...

  3. 洛谷P3899 [湖南集训]谈笑风生(线段树合并)

    题意 题目链接 Sol 线段树合并板子题,目前我看到两种写法,分别是这样的. 前一种每次需要新建一个节点,空间是\(O(4nlogn)\) 后者不需要新建,空间是\(O(nlogn)\)(面向数据算空 ...

  4. 主席树 || 可持久化线段树 || BZOJ 3653: 谈笑风生 || Luogu P3899 [湖南集训]谈笑风生

    题面:P3899 [湖南集训]谈笑风生 题解: 我很喜欢这道题. 因为A是给定的,所以实质是求二元组的个数.我们以A(即给定的P)作为基点寻找答案,那么情况分两类.一种是B为A的父亲,另一种是A为B的 ...

  5. luogu P3899 [湖南集训]谈笑风生

    传送门 nmyzd,mgdhls,bnmbzdgdnlql,a,wgttxfs 对于一个点\(a\),点\(b\)只有可能是他的祖先或者在\(a\)子树里 如果点\(b\)是\(a\)祖先,那么答案为 ...

  6. P3899 [湖南集训]谈笑风生

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3653 https://www.luogu.org/problemnew/show/P38 ...

  7. 【洛谷 P3899】 [湖南集训]谈笑风生 (主席树)

    题目链接 容易发现\(a,b,c\)肯定是在一条直链上的. 定义\(size(u)\)表示以\(u\)为根的子树大小(不包括\(u\)) 分两种情况, 1.\(b\)是\(a\)的祖先,对答案的贡献是 ...

  8. bzoj 3653 [湖南集训]谈笑风生

    题目描述 设 T 为一棵有根树,我们做如下的定义: • 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称"a 比 b 不知道高明到哪里去了". • 设 a ...

  9. Luogu 3899 [湖南集训]谈笑风生

    BZOJ 3653权限题. 这题方法很多,但我会的不多…… 给定了$a$,我们考虑讨论$b$的位置: 1.$b$在$a$到根的链上,那么这样子$a$的子树中的每一个结点(除了$a$之外)都是可以成为$ ...

随机推荐

  1. 洛谷P1368 均分纸牌(加强版) [2017年6月计划 数论14]

    P1368 均分纸牌(加强版) 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,纸牌总数必为 N 的倍数.可以在任一堆上取1张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取 ...

  2. [C#] 利用方向鍵移動 TextBox Focus

    論壇問題 版面上有 100 個 textbox,編號為 1-100,textbox 排列為 1 欄 20 個,共 5 欄,當一開打這個 form 會將在第一欄第一列第一個 textbox 的背景顏色變 ...

  3. CSS基础强化

    1. 浮动引起元素变成行内块元素-display:inline-block <div style="width: 400px;height: 200px;"> < ...

  4. Django项目:CRM(客户关系管理系统)--14--06PerfectCRM实现King_admin注册功能获取内存优化处理

    <th >{% get_app_name admin_class.model %}{{ admin_class }} </th> #kingadmin_tags.py # —— ...

  5. mysql错误日志目录

    在windows下,一般是mysql安装目录下的data目录下 ,扩展名是.err的文件.

  6. 你真的了解HTML吗

    有这么一段HTML,请挑毛病: <P> 哥写的不是HTML,是寂寞.<br><br> 我说: <br>不要迷恋哥,哥只是一个传说 这是原来雅虎一道笔试题 ...

  7. IO流-文件操作

    一.字节流读/写 文件 1.字节流 方式读取文件

  8. Jmeter压测报错:Non HTTP response code: java.net.ConnectExceptionexception的解决办法

    前一段时间进行jmeter压测时,一直报错,查看了下日志才发现报了一堆Non HTTP response code: java.net.ConnectExceptionexception,直接jmet ...

  9. Leetcode868.Binary Gap二进制间距

    给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离. 如果没有两个连续的 1,返回 0 . 示例 1: 输入:22 输出:2 解释: 22 的二进制是 0b10110 . ...

  10. kubernetes1.4新特性:支持两种新的卷插件

    背景介绍 在Kubernetes中卷的作用在于提供给POD持久化存储,这些持久化存储可以挂载到POD中的容器上,进而给容器提供持久化存储. 从图中可以看到结构体PodSpec有个属性是Volumes, ...