BZOJ3653: 谈笑风生
Description
设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)满足:
1. a、b和 c为 T 中三个不同的点,且 a为p 号节点;
2. a和b 都比 c不知道高明到哪里去了;
3. a和b 谈笑风生。这里谈笑风生中的常数为给定的 k。
Input
输入文件的第一行含有两个正整数n和q,分别代表有根树的点数与询问的个数。接下来n - 1行,每行描述一条树上的边。每行含有两个整数u和v,代表在节点u和v之间有一条边。
接下来q行,每行描述一个操作。第i行含有两个整数,分别表示第i个询问的p和k。
Output
输出 q 行,每行对应一个询问,代表询问的答案。
Sample Input
1 2
1 3
2 4
4 5
2 2
4 1
2 3
Sample Output
3
1
3
HINT
1<=P<=N
1<=K<=N
N<=300000
Q<=300000
#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {if(head==tail) {int l=fread(buffer,1,BufferSize,stdin);tail=(head=buffer)+l;}return *head++;
}
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;
}
typedef long long ll;
const int maxn=300010;
const int maxnode=maxn*20;
struct Query {int k,id,next;}Q[maxn];
int n,m,first2[maxn],first[maxn],next[maxn<<1],to[maxn<<1],dep[maxn],siz[maxn],e,cnt;
void AddEdge(int u,int v) {to[++e]=v;next[e]=first[u];first[u]=e;to[++e]=u;next[e]=first[v];first[v]=e;
}
void AddQuery(int x,int k,int id) {Q[++cnt]=(Query){k,id,first2[x]};first2[x]=cnt;
}
ll s[maxnode],ans[maxn];
int ls[maxnode],rs[maxnode],root[maxn],ToT;
void build(int& o,int l,int r,int p,int val) {if(!o) o=++ToT;s[o]+=val;if(l==r) return;int mid=l+r>>1;if(p<=mid) build(ls[o],l,mid,p,val);else build(rs[o],mid+1,r,p,val);
}
int merge(int x,int y) {if(!x) return y;if(!y) return x;s[x]+=s[y];ls[x]=merge(ls[x],ls[y]);rs[x]=merge(rs[x],rs[y]);return x;
}
ll query(int o,int l,int r,int x) {if(!o) return 0;if(l==r) return s[o];int mid=l+r>>1;if(x<=mid) return query(ls[o],l,mid,x);return s[ls[o]]+query(rs[o],mid+1,r,x);
}
void dfs(int x,int fa) {siz[x]=1;dep[x]=dep[fa]+1;ren if(to[i]!=fa) dfs(to[i],x),siz[x]+=siz[to[i]],root[x]=merge(root[x],root[to[i]]);for(int i=first2[x];i;i=Q[i].next) {int k=Q[i].k,j=Q[i].id;ans[j]=(ll)(siz[x]-1)*min(k,dep[x]-1);ans[j]+=query(root[x],1,n,min(n,dep[x]+k));}build(root[x],1,n,dep[x],siz[x]-1);
}
int main() {n=read();m=read();rep(i,2,n) AddEdge(read(),read());rep(i,1,m) {int p=read(),k=read();AddQuery(p,k,i);}dfs(1,0);rep(i,1,m) printf("%lld\n",ans[i]);return 0;
}
转载于:https://www.cnblogs.com/wzj-is-a-juruo/p/5508325.html
BZOJ3653: 谈笑风生相关推荐
- Bzoj3653 谈笑风生
Time Limit: 20 Sec Memory Limit: 512 MB Submit: 753 Solved: 295 Description 设T 为一棵有根树,我们做如下的定义: • ...
- COGS 2211. [BZOJ3653]谈笑风生
★★★★ 输入文件:laugh.in 输出文件:laugh.out 简单对比 时间限制:3 s 内存限制:512 MB [问题描述] 设T 为一棵有根树,我们做如下的定义: • 设a和 ...
- 【总结】一些简单线段树题目的口胡题解
bzoj1645 离散化+扫描线 tyvj1473 校门外的树3 思维僵化(非要套离线枚举右端点然而不好做)系列,直接容斥求不与[l,r][l,r][l,r]相交的线段个数即可 bzoj3653谈笑风 ...
- 【BZOJ3653】谈笑风生 离线+树状数组+DFS序
[BZOJ3653]谈笑风生 Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称"a比b不知道高明到哪里去了&quo ...
- BZOJ3653 洛谷3899:谈笑风生——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3653 https://www.luogu.org/problemnew/show/P3899 设 ...
- 【bzoj3653】谈笑风生
Description 设T 为一棵有根树,我们做如下的定义: • 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称"a比b不知道 高明到哪里去了". • 设a 和 b 为 ...
- [BZOJ3653][长链剖分]谈笑风生
BZOJ3653 我也不知道题面的引申意义 发现可以求出以每个点为p时的ans,讨论一下祖先和子孙的贡献,用长链剖分维护就好了 Code: #include<bits/stdc++.h> ...
- [FROM WOJ]#4317 谈笑风生
#4317 谈笑风生 bzoj3653 题面 设T 为一棵有根树,我们做如下的定义: 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称"a比b不知道 高明到哪里去了". 设 ...
- 18岁辍学,22岁进谷歌和Jeff Dean谈笑风生,这样的我究竟需不需要本科文凭?
机器之心报道 参与:蛋酱.张倩 人生没有固定的答案,但Chris Olah的道路,不一定适合所有人. 假如你年纪轻轻,就有机会进入顶尖的 AI 公司,时常和业内大佬「谈笑风生」,你还会回到大学,努力通 ...
最新文章
- GRE词汇乱序版-夹生的词汇2
- 大型网站HTTPS实践:HTTPS对性能的影响
- wordpress主题-一款功能强大的综合类型wordpress模板
- python n个list如何组成矩阵_有序矩阵中第K小的元素amp;x的平方根(二分法篇)
- bzoj3993 [SDOI2015]星际战争 二分答案+网络流检验
- 李国庆三位姐姐加入战局 正面刚俞渝:如继续侮辱我们,也将抓破你的脸!
- gdb调试mpi程序
- ts高仿C#的List、Dictionary
- 中科院计算机考研对外调剂吗,考研调剂信息:2020年中科院接收调剂研究生!...
- java密码加密方式_我去,同事居然用明文存储密码!!!
- 重新编译PHP加载PDO模块
- GAN里面的Kullback-Leibler Divergence和Jensen–Shannon Divergence
- 人脸识别摄像头与普通摄像头的区别
- 初识powerpoint的计算机教案,初识ppt教案.doc
- GMT5SAR--由*.grd文件生成*.ps
- 如何编写出优秀的代码
- 咏南开发框架之日志管理
- 通过Flex布局设置水平垂直居中
- c语言输入学号查找成绩,C语言程序设计按学号查询成绩
- 『迷你教程』识别人类活动的一维卷积神经网络模型,附完整代码
热门文章
- 基于Python实现相关分析案例
- Git教程_1 简介
- NAT-PT (Network Address Translation-Protocol)网络地址转换协议转换
- oracle样例数据库,创建和准备Oracle样例数据库
- Jupyter Notebook 代码补全功能配置
- scala数组入门到熟悉
- Windows核心编程MFC_gdi+发光字
- [转] Noise Contrastive Estimation 噪声对比估计 资料
- pdf png 转换超清
- 中科院合肥物质科学研究院葛运建团队: 智能机器人带来更美好生