谈笑风生

题目大意:

给定a,求任何一个距 a 距离不超过给定的 k 的 b ,然后求一个 c 使得其为 a,b 的后代,求这样的三元组共有多少个。

数据结构好题啊!

解法分析:

我们可以深搜两遍(其实一遍也行),然后对于每个节点去权值线段树上跑一跑,记录 dfs 序,然后就成功地与江大大谈笑风生了。


//by Judge
#include<cstdio>
#include<iostream>
#define ll long long
#define mid (l+r>>1)
using namespace std;
const int M=3e5+7;
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline int read(){ int x=0,f=1; char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} char sr[1<<21],z[20];int C=-1,Z;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
inline void print(ll x,char chr='\n'){if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;while(z[++Z]=x%10+48,x/=10);while(sr[++C]=z[Z],--Z);sr[++C]=chr;
} int n,m,q,p,k,pat,tim,cnt,le,ri,head[M],rt[M];
int dep[M],siz[M],dfn[M],L[M*21],R[M*21]; ll ans,sum[M*21];
struct Edge{ int to,next; }e[M<<1];
inline void add(int u,int v){e[++pat]={v,head[u]},head[u]=pat;e[++pat]={u,head[v]},head[v]=pat;
} void update(int las,int& now,int l,int r,int pos,int v){if(!now) now=++cnt; sum[now]=sum[las]+v; if(l==r) return ;if(pos<=mid) R[now]=R[las],update(L[las],L[now],l,mid,pos,v);else L[now]=L[las],update(R[las],R[now],mid+1,r,pos,v);
} ll query(int u,int v,int l,int r,int ql,int qr){if(l>qr||ql>r) return 0; if(ql<=l&&r<=qr) return sum[v]-sum[u];return query(L[u],L[v],l,mid,ql,qr)+query(R[u],R[v],mid+1,r,ql,qr);
} inline void cmax(int& a,int b){ if(a<b) a=b; }
#define v e[i].to
void prep(int u,int fa){siz[u]=1,dep[u]=dep[fa]+1,cmax(m,dep[u]);for(int i=head[u];i;i=e[i].next)if(v^fa) prep(v,u),siz[u]+=siz[v];
} void dfs(int u,int fa){ dfn[u]=++tim;update(rt[tim-1],rt[tim],1,m,dep[u],siz[u]-1);for(int i=head[u];i;i=e[i].next) if(v^fa) dfs(v,u);
}
int main(){ n=read(),q=read();for(int i=1,x,y;i<n;++i)x=read(),y=read(),add(x,y);for(prep(1,0),dfs(1,0);q;--q){p=read(),k=read(),le=dfn[p],ri=le+siz[p]-1;ans=query(rt[le],rt[ri],1,m,dep[p]+1,dep[p]+k);ans+=1ll*min(dep[p]-1,k)*(siz[p]-1),print(ans);} return Ot(),0;
}

转载于:https://www.cnblogs.com/Judge/p/9963551.html

[湖南集训]谈笑风生相关推荐

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

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

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

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

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

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

  4. [湖南集训] 谈笑风生

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 迪桑特案例拆解:社群运营如何在高端运动服装品牌中发挥价值?
  2. oracle表空间大小规划,关于oracle表空间的规划方法
  3. 可以多次使用同一个hbitmap吗_求婚钻戒和结婚钻戒可以是同一个吗?意义戴法各不同,别胡乱混淆...
  4. Top10机器学习开源项目发布,历时一个月评出 | 附GitHub地址
  5. CodeDom六--实体类生成示例
  6. System Verilog——任务和函数 Part-I
  7. 阿里开源mysql监控_Alibaba-技术专区-开源项目之Druid数据库监控平台
  8. 蓝桥c++2013真题:前缀判断(代码填空)
  9. exe变计算机病毒,文件夹变exe病毒怎么恢复 文件夹exe病毒的解决方法
  10. 51单片机——实现呼吸灯程序代码
  11. 智能语音呼叫中心系统
  12. 桌面cpu与服务器cpu天梯,桌面CPU性能排行 桌面CPU天梯图2017年6月最新版
  13. 用计算机对医学图像做后处理,医学影像学中图像数字化的运用
  14. 使用 Autel MaxiFlash Elite 进行 GM J2534 编程
  15. vue基于file-saver处理二进制文件流,导出文件
  16. 斯坦福大学开放课程:编程方法.02/第二课练习:karel 跳墙
  17. 数组越界及其避免方法,C语言数组越界详解
  18. 基于博弈论的出租车系统效率优化
  19. 计算机在化学中的应用心得体会,我对分析化学的认识和感悟
  20. I2C协议研读(五):7位地址构成详解

热门文章

  1. 欢迎关注异贝!今天异贝与您一起分享:美容行业异贝引客方案设计!
  2. 备份Ubuntu12.04 并制作成iso安装文件
  3. Android 节日短信送祝福(功能篇:1-数据库操作类与自定义ContentProvider)
  4. Android端简单数据库实现
  5. 还不了解游戏建模教程吗?看完这篇文章让你从小白变为油条
  6. 微信小程序之个人界面编写(2023.5.9版)
  7. JZOJ5939. 【NOIP2018模拟10.30】阻击计划
  8. 如何用mysql创建orders表_MySQL学习十四创建和操纵表
  9. 一个资深程序员看12306(四)
  10. 一个程序员是如何蜕变为投资人的?