#4317 谈笑风生

bzoj3653

题面
设T 为一棵有根树,我们做如下的定义:
设a和b为T 中的两个不同节点。如果a是b的祖先,那么称“a比b不知道 高明到哪里去了”。
设a 和 b 为 T 中的两个不同节点。如果 a 与 b 在树上的距离不超过某个给定 常数x,那么称“a 与b 谈笑风生”。
给定一棵n个节点的有根树T,节点的编号为1 到 n,根节点为1号节点。你需
要回答q 个询问,询问给定两个整数p和k,问有多少个有序三元组(a;b;c)满足:
a、b和 c为 T 中三个不同的点,且 a为p 号节点;
a和b 都比 c不知道高明到哪里去了;
a和b 谈笑风生。这里谈笑风生中的常数为给定的 k。

输入
第一行含有两个正整数n和q,分别代表有根树的点数与询问的个数。
接下来n - 1行,每行描述一条树上的边。每行含有两个整数u和v,代表在节点u和v之间有一条边。
接下来q行,每行描述一个操作。第i行含有两个整数,分别表示第i个询问的p和k。
1<=P<=N
1<=K<=N
N<=300000
Q<=300000

输出
输出 q 行,每行对应一个询问,代表询问的答案。

样例输入
5 3
1 2
1 3
2 4
4 5
2 2
4 1
2 3

样例输出
3
1
3

SOL
1.若b是a的祖先,就是a的size乘上a的祖先有多少个可以为b
2.若b是a的儿子,那就是a子树的所有距离a不超过k的点的size之和,f[i][j]表示i子树距i小于等于j的所有点的size之和,用长链剖分优化即可

代码:

#include<bits/stdc++.h>
using namespace std;
#define re register
#define int long long
inline int rd(){int data=0;static char ch=0;ch=getchar();while(!isdigit(ch))ch=getchar();while(isdigit(ch))data=(data<<1)+(data<<3)+(ch^48),ch=getchar();return data;
}
inline void write(int x){if(x>9)write(x/10);putchar(x%10+'0');}
const int N=3e5+5;
int n,Q,cnt,first[N],siz[N],fa[N],len[N],lson[N],dep[N];
int tmp[N],*f[N],*id=tmp,ans[N];bool vis[N];
struct node{int v,nxt;}e[N<<1];
inline void add(int u,int v){e[++cnt]=(node){v,first[u]};first[u]=cnt;}
struct query{int num,k;};
vector<query>q[N];
void dfs(int u){siz[u]=1,vis[u]=1;for(int re i=first[u];i;i=e[i].nxt){int re v=e[i].v;if(vis[v])continue;fa[v]=u,len[v]=dep[v]=dep[u]+1,dfs(v),siz[u]+=siz[v];if(len[lson[u]]<len[v])lson[u]=v;}if(lson[u])len[u]=len[lson[u]];
}
void solve(int u){f[u][0]=siz[u]-1;if(lson[u])f[lson[u]]=f[u]+1,solve(lson[u]),f[u][0]+=f[lson[u]][0];for(int re i=first[u];i;i=e[i].nxt){int re v=e[i].v;if(v==lson[u]||v==fa[u])continue;f[v]=id,id+=len[v]-dep[v]+1;solve(v);for(int re j=0;j<=len[v]-dep[v];j++)f[u][j+1]+=f[v][j];f[u][0]+=f[v][0];}for(int re i=q[u].size()-1ll;~i;i--){int re k=q[u][i].k,num=q[u][i].num;ans[num]+=(siz[u]-1)*min(dep[u]-1,k);if(k>=len[u]-dep[u])ans[num]+=f[u][0]-siz[u]+1;else ans[num]+=f[u][0]-siz[u]+1-f[u][k+1];}
}
signed main(){n=rd(),Q=rd();for(int re i=1;i<n;i++){int re x=rd(),y=rd();add(x,y),add(y,x);}dep[1]=1,dfs(1);for(int re i=1;i<=Q;i++){int re p=rd(),k=rd();q[p].push_back((query){i,k});}f[1]=id,id+=len[1],solve(1);for(int re i=1;i<=Q;i++)write(ans[i]),putchar('\n');return 0;
}

[FROM WOJ]#4317 谈笑风生相关推荐

  1. 18岁辍学,22岁进谷歌和Jeff Dean谈笑风生,这样的我究竟需不需要本科文凭?

    机器之心报道 参与:蛋酱.张倩 人生没有固定的答案,但Chris Olah的道路,不一定适合所有人. 假如你年纪轻轻,就有机会进入顶尖的 AI 公司,时常和业内大佬「谈笑风生」,你还会回到大学,努力通 ...

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

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

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

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

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

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

  5. toj 4317 多连块拼图

    toj 4317 多连块拼图 时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte 总提交: 40 测试通过:21 描述 多连块是指由多个等大正方形边与边连接而成的平 ...

  6. BZOJ3653 洛谷3899:谈笑风生——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3653 https://www.luogu.org/problemnew/show/P3899 设 ...

  7. 【刷题】BZOJ 3653 谈笑风生

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

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

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

  9. BZOJ3653: 谈笑风生

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

最新文章

  1. centos7-同步时间
  2. 跨境电商Crazysales的高稳定性架构实践
  3. python中自定义函数如何传递动态参数_python 函数的动态参数
  4. 计算机不会输入函数怎么办,函数不正确_电脑上文件打不开,显示函数不正确怎么解决?...
  5. java进程和线程_Java™ 教程(进程和线程)
  6. 飞鸽_飞鸽传书_飞鸽传书2010_飞鸽传书2010下载
  7. Dart 语言基础入门 Dart 语言核心库一览
  8. 华为畅享8的悬浮窗在哪里_1299元起,更大超清屏幕+强劲续航 华为畅享20 SE发布...
  9. 云服务器的安全组各个端口代表什么意思?
  10. windows下使用Wireshark调试chrome浏览器的HTTP/2流量
  11. ***工具XSCAN V3.3 GUI的使用
  12. java 字符串随机排列_Java 随机字符串排序
  13. 明解c语言入门篇第三版第九章答案,明解C语言 入门篇 第一章答案
  14. 澳洲网:澳高考生扎堆申请专业 热衷艺术及护理学位
  15. RTKlib相对定位源码解析: udstate函数
  16. JAVASE笔记回顾
  17. 数据科学与大数据技术——软科中国大学专业排名
  18. 录屏流程 - 安卓R
  19. android5.0源码开发之NVRam存储,恢复出厂设置数据不被擦除--上篇
  20. 【React】解决antd样式没有显示问题(网页频闪问题)

热门文章

  1. android7.0版本适配(一):应用间文件文件共享——FileProvider
  2. 2013上半年 系统集成项目管理工程师 下午试卷
  3. 为什么说线上教育是未来的趋势?
  4. SpringCloud整合Sa-Token登录认证+Gateway网关拦截
  5. iOS图形编辑之Core Graphics
  6. 2022年7月22日,记录我的第一篇博客
  7. 又一次回归,再一次记录
  8. Python练习题——初学Python记录
  9. 用PS做手机计算机,功能与电脑ps相媲美的手机画画软件
  10. Python 在线电子零售公司销售数据(Online Retail | Kaggle)关联规则分析(Apriori算法)