题意题解:
首先对于树上某个点a来说,假设点b是a的祖先(也就是在a的上面),那么答案很好计算,也就是min(k,dep[a]−1)∗(size[a]−1)min(k,dep[a]-1)*(size[a]-1)min(k,dep[a]−1)∗(size[a]−1)

麻烦的就是计算b在a下面的情况。
主席树。
如何建立这颗主席树呢?
按照每个结点的深度建立主席树即可。
对于下面的结点来说,我们假设一个结点iii,那么这个结点对答案的贡献则为size[i]−1size[i]-1size[i]−1
那么我们在dfs序的时候,对于结点iii,插入权值为size[i]−1size[i]-1size[i]−1即可(size为子树大小)
这样就把他给变成了二维数点的问题了。
也就是查询a这颗子树,深度为dep[a]+1到dep[a]+kdep[a]+1到dep[a]+kdep[a]+1到dep[a]+k的和即可。

代码:

#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;const int maxn=3e5+10;int rt[maxn],ls[maxn*50],rs[maxn*50];
long long sum[maxn*50];
int tot,n,q;
void update(int &node,int start,int ends,int lst,int pos,int val){node=++tot;ls[node]=ls[lst];rs[node]=rs[lst];sum[node]=sum[lst]+val;if(start==ends) return;int mid=(start+ends)/2;if(pos<=mid) update(ls[node],start,mid,ls[lst],pos,val);else update(rs[node],mid+1,ends,rs[lst],pos,val);
}
long long query(int start,int ends,int l,int r,int x,int y){if(l<=start&&ends<=r){return sum[y]-sum[x];}int mid=(start+ends)/2;long long ans=0;if(l<=mid) ans+=query(start,mid,l,r,ls[x],ls[y]);if(mid<r) ans+=query(mid+1,ends,l,r,rs[x],rs[y]);return ans;
}vector<int> edge[maxn];
int siz[maxn],son[maxn],in[maxn],fa[maxn],dep[maxn];
int cnt;
void dfs1(int u,int f){dep[u]=dep[f]+1;siz[u]=1;for(auto i:edge[u]){if(i==f) continue;dfs1(i,u);siz[u]+=siz[i];}
}
void build(int u,int f){in[u]=++cnt;update(rt[cnt],1,n,rt[cnt-1],dep[u],siz[u]-1);for(auto i:edge[u]){if(i==f) continue;build(i,u);}
}signed main(){ios::sync_with_stdio(false);cin.tie(0);cin>>n>>q;for(int i=1;i<n;i++){int x,y;cin>>x>>y;edge[x].push_back(y);edge[y].push_back(x);}dfs1(1,0);
//    dfs2(1,1);build(1,0);while(q--){int x,y;cin>>x>>y;long long ans=min(y,dep[x]-1)*1ll*(siz[x]-1);//cout<<"debug "<<ans<<endl;ans+=query(1,n,dep[x]+1,min(dep[x]+y,n),rt[in[x]-1],rt[in[x]+siz[x]-1]);cout<<ans<<endl;//cout<<"debug "<<maxdep<<" "<<dep[x]+1<<" "<<dep[x]+y<<" "<<in[x]-1<<" "<<in[x]+siz[x]-1<<endl;}}

[湖南集训]更为厉害 树上主席树-以树深度为下下标建立主席树相关推荐

  1. P3899 [湖南集训]更为厉害(线段树合并、长链剖分、二维数点)

    P3899 [湖南集训]更为厉害 若 deepb<deepa\text{deep}_b<\text{deep}_adeepb​<deepa​:c 在点 a 的子树中,根据乘法原理计算 ...

  2. 【编程题目】输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印...

    第 16 题(树): 题目(微软): 输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印. 例如输入 8 / \ 6 10 / \ / \ 5 7 9 11 输出 8 6 1 ...

  3. 输入一颗二元树,从上向下按层打印树的每个节点,同一层中,按照从左到右的顺序打印。...

    输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印,具体实现如下: #include <iostream> using namespace std;typedef ...

  4. 洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)

    题目链接:点击查看 题目大意:设 TTT 为一棵有根树,我们做如下的定义: 设 aaa 和 bbb 为 TTT 中的两个不同节点.如果 aaa 是 bbb 的祖先,那么称"aaa 比 bbb ...

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

    P3899 [湖南集训]谈笑风生 给定一颗以111号节点为根的树,如果a≠ba \neq ba​=b,且aaa是bbb的祖先,则aaa比bbb更厉害,如果a≠ba \neq ba​=b,且dis( ...

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

    P3899 [湖南集训]谈笑风生 题目描述 Solution 我们考虑离线询问,将询问放在相对应的子树ppp中计算答案. 显然a,b,ca,b,ca,b,c的位置关系有两种情况: bbb是aaa的祖先 ...

  7. Super Mario HDU - 4417(主席树解决区间数字小于k的个数||线段树+离线)

    Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...

  8. 2020牛客NOIP赛前集训营-提高组(第三场)C-牛半仙的妹子Tree【虚树,最短路】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/7609/C 题目大意 给出nnn个点的一棵树,mmm个时刻各有一个操作 标记一个点,每个点被标记后的每一个时刻 ...

  9. Zju2112 Dynamic Rankings(树状数组套可持久化权值线段树)

    Zju2112 Dynamic Rankings description solution code description 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须 ...

最新文章

  1. 恶搞c语言程序设计,C语言编程学习:让人绝望的C语言恶搞小程序(二)
  2. 【LeetCode】35. 搜索插入位置(C++实现)
  3. 文本编辑器查看 cprintf颜色_实战PyQt5: 028-纯文本编辑控件QPlainTextEdit
  4. 2020年的风口来了!传统企业如何做数字化转型?
  5. Mac 系统部署Frp内网穿透服务 实现frpc shell启动脚本启动、停止
  6. 【C++ Primer】第五章学习笔记(循环和关系表达式)
  7. 强悍的命令行 —— basename 去掉路径和扩展名 dirname 获取路径
  8. Eclipse的一些常用的快捷键
  9. MySQL集群和主从复制分别适合在什么场景下使用
  10. php中用microtime()函数来测试代码运行时间
  11. mysql分析语句方法_Mysql分析-常用分析语句总结
  12. Java多线程电影院_java 多线程-快乐订座电影院
  13. HTTP和HTTPS请求的整个过程详解
  14. android如何设置自适应大小的背景图片,Android 背景图片自适应方案
  15. 2019 中国AI/ MR十大新闻:梦想照进现实!
  16. Android 动态修改app名称(市场和手机中显示两个不同的名称)
  17. CreateCompatibleDC 和 CreateCompatibleBitmap
  18. 嫌微信公众号排版太丑?这里让你一步到位
  19. Google商店中下载安兔兔评测,后下载3D资源插件,提示“您的设备与此版本不兼容”
  20. Weblogic报错BEA-141281

热门文章

  1. python高阶函数(abs()、round()、map()、reduce()、filter())
  2. OpenCV-Python我刚写六行代码就出了个惊天BUG
  3. 经验之谈|别再在CNN中使用Dropout了
  4. 计算机视觉以及它在商业中是如何应用的?
  5. 【新手必看】17个常见的Python运行时错误
  6. 43.6% mAP! 阿里巴巴提出:用于一阶段目标检测的半锚式检测器
  7. 【OpenCV 4开发详解】多通道分离与合并
  8. CentOS5.4 上将Python进行升级,已经解决yum不可用的问题(转载)
  9. CUDA FORTRAN编译器
  10. 小米miui系统怎么关闭文件管理里的热门视频和表情?