题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3653

对于一个 (a,b,c),分成 b 是 a 的祖先和 b 在 a 子树里两部分;

第一部分 b 可以选 min(dep[a]-1,k) 个,c 可以选 siz[a]-1 个,乘起来即可;

第二部分,要求 ∑siz[u]-1,其中 u 是 a 子树内到 a 距离不超过 k 的点;

考虑到子树在 dfs 序上就是一段区间,距离范围又可以看作 dep 范围,所以在 dfs 序上建主席树,就可以查询对应 dep 的和;

别忘了 long long。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mid ((l+r)>>1)
using namespace std;
typedef long long ll;
int const xn=3e5+,xm=xn*;
int n,hd[xn],ct,to[xn<<],nxt[xn<<],tim,dfn[xn],siz[xn],id[xn],dep[xn];
int cnt,ls[xm],rs[xm],rt[xn];
ll sum[xm];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
int gt[];
void wr(ll x)
{
if(!x){putchar(''); return;}
if(x<){putchar('-'); x=-x;}
int t=;
while(x)gt[++t]=x%,x/=;
for(int i=t;i;i--)putchar(gt[i]+'');
}
void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;}
void dfs(int x,int fa)
{
dfn[x]=++tim; id[tim]=x; siz[x]=; dep[x]=dep[fa]+;
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==fa)continue;
dfs(u,x); siz[x]+=siz[u];
}
}
void update(int &x,int y,int l,int r,int pos,int v)
{
x=++cnt; ls[x]=ls[y]; rs[x]=rs[y]; sum[x]=sum[y]+v;
if(l==r)return;
if(pos<=mid)update(ls[x],ls[y],l,mid,pos,v);
else update(rs[x],rs[y],mid+,r,pos,v);
sum[x]=sum[ls[x]]+sum[rs[x]];
}
ll query(int x,int y,int l,int r,int L,int R)
{
if(l>=L&&r<=R)return sum[y]-sum[x];
ll ret=;
if(mid>=L)ret+=query(ls[x],ls[y],l,mid,L,R);
if(mid<R)ret+=query(rs[x],rs[y],mid+,r,L,R);
return ret;
}
int main()
{
n=rd(); int q=rd();
for(int i=,x,y;i<n;i++)
{
x=rd(); y=rd();
add(x,y); add(y,x);
}
dfs(,);
for(int i=;i<=n;i++)
update(rt[i],rt[i-],,n,dep[id[i]],siz[id[i]]-);
for(int i=,p,k;i<=q;i++)
{
p=rd(); k=rd();
ll ans=(ll)min(dep[p]-,k)*(siz[p]-);
ans+=query(rt[dfn[p]],rt[dfn[p]+siz[p]-],,n,dep[p]+,dep[p]+k);
wr(ans); puts("");
}
return ;
}

最新文章

  1. SQLSERVER聚集索引与非聚集索引的再次研究(下)
  2. 浅谈rem、em、px
  3. jQuery基础--样式篇(1)
  4. 关于git SSH Key的 生成
  5. [深入浅出WP8.1(Runtime)]数据绑定的基础
  6. IOC容器初始化过程
  7. 关于word-break,word-wrap换行
  8. EasyUI 1.3之前DataGrid中动态选中、获取Checkbox
  9. WEB浏览器与服务器通讯过程
  10. 方便android开发网站:
  11. 欲练JS,必先攻CSS——前端修行之路
  12. 字符串匹配KMP算法的C语言实现
  13. BZOJ 1025: [SCOI2009]游戏 [置换群 DP]
  14. HttpServletRequest字符集问题
  15. python逻辑回归 自动建模
  16. ceph 生成rpm包
  17. python 读写json文件(dump, load),以及对json格式的数据处理(dumps, loads)
  18. chrome flash
  19. 黄聪:.NET中zip的压缩和解压——SharpCompress
  20. MTK 永不熄屏

热门文章

  1. python文件追加及时间获取
  2. Ubuntu下Deb软件包相关安装与卸载
  3. android 获得系统时间
  4. [Javascript] Use a custom sort function on an Array in Javascript
  5. leetCode 65.Valid Number (有效数字)
  6. Android NDK JNI WARNING: illegal start byte 0x
  7. snip_opencv环境配置和测试程序
  8. mysql limit分页优化方法分享
  9. Linux主要命令
  10. Codeforces 8VC Venture Cup 2016 - Elimination Round F. Group Projects 差分DP*****