[FROM WOJ]#4317 谈笑风生
#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 谈笑风生相关推荐
- 18岁辍学,22岁进谷歌和Jeff Dean谈笑风生,这样的我究竟需不需要本科文凭?
机器之心报道 参与:蛋酱.张倩 人生没有固定的答案,但Chris Olah的道路,不一定适合所有人. 假如你年纪轻轻,就有机会进入顶尖的 AI 公司,时常和业内大佬「谈笑风生」,你还会回到大学,努力通 ...
- 洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)
题目链接:点击查看 题目大意:设 TTT 为一棵有根树,我们做如下的定义: 设 aaa 和 bbb 为 TTT 中的两个不同节点.如果 aaa 是 bbb 的祖先,那么称"aaa 比 bbb ...
- P3899 [湖南集训]谈笑风生(线段树合并)
P3899 [湖南集训]谈笑风生 给定一颗以111号节点为根的树,如果a≠ba \neq ba=b,且aaa是bbb的祖先,则aaa比bbb更厉害,如果a≠ba \neq ba=b,且dis( ...
- P3899 [湖南集训]谈笑风生
P3899 [湖南集训]谈笑风生 题目描述 Solution 我们考虑离线询问,将询问放在相对应的子树ppp中计算答案. 显然a,b,ca,b,ca,b,c的位置关系有两种情况: bbb是aaa的祖先 ...
- toj 4317 多连块拼图
toj 4317 多连块拼图 时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte 总提交: 40 测试通过:21 描述 多连块是指由多个等大正方形边与边连接而成的平 ...
- BZOJ3653 洛谷3899:谈笑风生——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3653 https://www.luogu.org/problemnew/show/P3899 设 ...
- 【刷题】BZOJ 3653 谈笑风生
Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称"a比b不知道 高明到哪里去了". ? 设a 和 b 为 ...
- [湖南集训] 谈笑风生
题意: 设 T 为一棵有根树,我们做如下的定义: • 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称"a 比 b 不知道高明到哪里去了". • 设 a ...
- BZOJ3653: 谈笑风生
Description 设T 为一棵有根树,我们做如下的定义: • 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称"a比b不知道 高明到哪里去了". • 设a 和 b 为 ...
最新文章
- centos7-同步时间
- 跨境电商Crazysales的高稳定性架构实践
- python中自定义函数如何传递动态参数_python 函数的动态参数
- 计算机不会输入函数怎么办,函数不正确_电脑上文件打不开,显示函数不正确怎么解决?...
- java进程和线程_Java™ 教程(进程和线程)
- 飞鸽_飞鸽传书_飞鸽传书2010_飞鸽传书2010下载
- Dart 语言基础入门 Dart 语言核心库一览
- 华为畅享8的悬浮窗在哪里_1299元起,更大超清屏幕+强劲续航 华为畅享20 SE发布...
- 云服务器的安全组各个端口代表什么意思?
- windows下使用Wireshark调试chrome浏览器的HTTP/2流量
- ***工具XSCAN V3.3 GUI的使用
- java 字符串随机排列_Java 随机字符串排序
- 明解c语言入门篇第三版第九章答案,明解C语言 入门篇 第一章答案
- 澳洲网:澳高考生扎堆申请专业 热衷艺术及护理学位
- RTKlib相对定位源码解析: udstate函数
- JAVASE笔记回顾
- 数据科学与大数据技术——软科中国大学专业排名
- 录屏流程 - 安卓R
- android5.0源码开发之NVRam存储,恢复出厂设置数据不被擦除--上篇
- 【React】解决antd样式没有显示问题(网页频闪问题)
热门文章
- android7.0版本适配(一):应用间文件文件共享——FileProvider
- 2013上半年 系统集成项目管理工程师 下午试卷
- 为什么说线上教育是未来的趋势?
- SpringCloud整合Sa-Token登录认证+Gateway网关拦截
- iOS图形编辑之Core Graphics
- 2022年7月22日,记录我的第一篇博客
- 又一次回归,再一次记录
- Python练习题——初学Python记录
- 用PS做手机计算机,功能与电脑ps相媲美的手机画画软件
- Python 在线电子零售公司销售数据(Online Retail | Kaggle)关联规则分析(Apriori算法)