题面

这道题应该比较裸吧。

\(a\),\(b\)都是\(c\)的祖先。

那么第一种情况是\(b\)是\(a\)的祖先,那么方案数就是\(\min\{dep[a]-1,k\}\cdot (num[a]-1)\)。

第二种是\(a\)是\(b\)的祖先,那么方案数是
\[ \sum_{c\in subtree(a),dep[c]-dep[a]\leq k} num[c]-1 \]
显然这东西用主席树,一个维度是dfs序,一个维度数深度维护一下就好了吧。

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define REP(i,a,n) for(register int i(a);i<=(n);++i)
#define FEC(i,x,y) for(register int i=head[x],y=g[i].to;i;i=g[i].ne,y=g[i].to)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
const int SZ=(1<<21)+1;char ibuf[SZ],*iS,*iT,obuf[SZ+128],*oS=obuf,*oT=obuf+SZ-1;
#ifdef ONLINE_JUDGE
#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SZ,stdin),(iS==iT?EOF:*iS++)):*iS++)
#else
#define gc() getchar()
#endif
template<typename I>inline void read(I&x){char c=gc();int f=0;for(;c<'0'||c>'9';c=gc())c=='-'?f=1:0;for(x=0;c>='0'&&c<='9';c=gc())x=(x<<1)+(x<<3)+(c&15);f?x=-x:0;}
inline void flush(){fwrite(obuf,1,oS-obuf,stdout);oS=obuf;}
#define printf(...) (oS>oT&&(flush(),1),oS+=sprintf(oS,__VA_ARGS__))
template<typename A,typename B>inline char SMAX(A&a,const B&b){return a<b?a=b,1:0;}
template<typename A,typename B>inline char SMIN(A&a,const B&b){return a>b?a=b,1:0;}
typedef long long ll;typedef unsigned long long ull;typedef std::pair<int,int>pii;const int N=300000+7;
int n,Q,x,y,dfn[N],pre[N],dfc,dep[N],num[N],a[N],T;
struct Edge{int to,ne;}g[N<<1];int head[N],tot;
inline void Addedge(int x,int y){g[++tot].to=y;g[tot].ne=head[x];head[x]=tot;}inline void DFS(int x,int fa=0){dfn[x]=++dfc;pre[dfc]=x;dep[x]=dep[fa]+1;num[x]=1;FEC(i,x,y)if(y!=fa)DFS(y,x),num[x]+=num[y];
}struct Node{int lc,rc,id;ll val;}t[N*21];int RT[N],nod;
inline void Insert(int&o,int L,int R,int x,int k){if(t[o].id!=T)t[++nod]=t[o],t[o=nod].id=T;t[o].val+=k;if(L==R)return;int M=(L+R)>>1;x<=M?Insert(t[o].lc,L,M,x,k):Insert(t[o].rc,M+1,R,x,k);
}
inline ll Query(int o,int p,int L,int R,int l,int r){if(l<=L&&R<=r)return t[o].val-t[p].val;int M=(L+R)>>1;if(r<=M)return Query(t[o].lc,t[p].lc,L,M,l,r);if(l>M)return Query(t[o].rc,t[p].rc,M+1,R,l,r);return Query(t[o].lc,t[p].lc,L,M,l,r)+Query(t[o].rc,t[p].rc,M+1,R,l,r);
}inline char cmp(const int&x,const int&y){return dep[x]<dep[y];}
int main(){read(n);read(Q);REP(i,1,n-1)read(x),read(y),Addedge(x,y),Addedge(y,x);DFS(1);REP(i,1,n)a[i]=i;std::sort(a+1,a+n+1,cmp);int p=1;REP(i,1,n){++T;RT[i]=RT[i-1];while(p<=n&&dep[a[p]]==i)Insert(RT[i],1,n,dfn[a[p]],num[a[p]]-1),++p;//错误笔记:这里的i,p要分清楚不能弄混掉了}REP(i,1,Q){read(x),read(y);//错误笔记:同第49行,i,x要分清楚 printf("%lld\n",std::min(dep[x]-1,y)*(ll)(num[x]-1)+Query(RT[std::min(dep[x]+y,n)],RT[dep[x]],1,n,dfn[x],dfn[x]+num[x]-1));//错误笔记:要把dep[x]+y和n取个min,不然的话还没更新过}return flush(),0;
}

转载于:https://www.cnblogs.com/hankeke/p/BZOJ3653.html

[BZOJ3653]谈笑风生 主席树相关推荐

  1. P3899 [湖南集训]谈笑风生 主席树解决二维数点

    传送门 文章目录 题意: 思路: 题意: 思路: 由于a,ba,ba,b都比ccc厉害,那么a,ba,ba,b一定是某个是某个的祖先.那么就分为两种情况了: (1)(1)(1) bbb在aaa上面,约 ...

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

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

  3. 数据结构(主席树):COGS 2211. 谈笑风生

    2211. 谈笑风生 ★★★★   输入文件:laugh.in   输出文件:laugh.out   简单对比 时间限制:3 s   内存限制:512 MB [问题描述] 设T 为一棵有根树,我们做如 ...

  4. P3899-[湖南集训]谈笑风生【主席树】

    正题 题目链接:https://www.luogu.com.cn/problem/P3899 题目大意 给出nnn个点的一棵有根树,每次询问一个(p,k)(p,k)(p,k),求有多少个点对(b,c) ...

  5. [主席树] 湖南集训 谈笑风生

    传送门 一.做法 CCC一定是A,BA, BA,B公共子树里的点 B在A上方 则C一定在A子树中 ans=min⁡{k,dep[A]−1}×(siz[A]−1)ans=\min\{k,dep[A]-1 ...

  6. COGS 2211. [BZOJ3653]谈笑风生

    ★★★★   输入文件:laugh.in   输出文件:laugh.out   简单对比 时间限制:3 s   内存限制:512 MB [问题描述] 设T 为一棵有根树,我们做如下的定义: • 设a和 ...

  7. hdu 2665(主席树查询区间k大值)

    先贴我自己写的代码做模板虽然跟原博主没什么两样.(一开始空间开的4*maxn,交到hdu上一直TLE很奇怪) #include<bits/stdc++.h> using namespace ...

  8. P3168 [CQOI2015]任务查询系统 差分+主席树

    链接在这~:https://www.luogu.org/problem/P3168 主席静态区间修改,单点查询 区间(L,R)加1可以通过差分以后转换为L位置加1,R+1位置减1 我们只需要记录一下, ...

  9. 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并

    click here~:https://www.luogu.org/problem/P3302 emmm这个题是真的烦 一看题发现这题不是count on a tree的升级版么 如果一点思路没有的话 ...

  10. 洛谷 P2468 粟粟的书架 二分(主席树+前缀和)

    传送~:https://www.luogu.org/problem/P2468 看了一下数据也发现是两道题,后边当他是一个序列(n==1)的时候直接主席树二分区间前k大和就行了 但是有一个细节我觉得就 ...

最新文章

  1. ICML2020 | 基于贝叶斯元学习在关系图上进行小样本关系抽取
  2. 【ASP.NET 问题】Win7中IIS被防火墙阻止导致外网无法访问的解决方法。
  3. 【Web安全】提权—使用中国菜刀和iis6.exe在目标服务器创建Administrators用户
  4. NeurIPS 2019最热趋势-贝叶斯深度学习
  5. 在Ubuntu中使用OTB-50测试ECO模型
  6. Requests库网络爬虫实战
  7. 为什么要将html页面和样式表分离,0031 如何使用css文件对网页内容和样式进行分离...
  8. c#之跟踪(c#高级编程系列)
  9. Oracle在Solaris下的机能与调整简介
  10. 原生JS 将canvas生成图片
  11. JVM参数之-XX:+HeapDumpOnOutOfMemoryError(导出内存溢出的堆信息(hprof文件))
  12. “无法找到Internet Explorer”的解决方法
  13. 载入Haskell的函数
  14. eclipse代码加版权头插件
  15. Windows Server 2012 R2 安装密钥
  16. 实践:服务器编写/系统架构/cache
  17. HP台式机安装WIN10
  18. windows系统IP地址、localhost、127.0.0.1 、0.0.0.0和 本机IP区别
  19. OpenMV新手上路1 -- OpenMV简介、参数描述
  20. 双重福利:计算机图书满100减50+满99 减10叠加券,更有抽奖送书活动,点击查看!...

热门文章

  1. 社会心理学(第8版)
  2. 功能强大~带你走近Smartbi增强分析模块
  3. Redis 客户端哪家强? Lettuce手下见真香!
  4. 服务器显示没有权限设置,服务器没有管理员权限设置
  5. Android - 城市/单项/国家区号选择器基础使用 及 使用国际区号json文件
  6. 文本编辑器 - 同时编辑多行
  7. python opendr_《网络工程师的Python之路》出书了!
  8. C. Inna and Dima
  9. Opencv3.2各个模块功能详细简介(包括与Opencv2.4的区别)
  10. 浅谈opencv3.2中各个模块的简介