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

5 3
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

啊,摸蛤题。。。
根据定义不难发现abc三点应该同在一条直链上,那么我们按b在a上面和下面2种情况分类
第一种情况很简单,因为a子树除a之外的所有节点都可以作为c。
第二种情况是一个偏序结构,b应该在a子树内部且b的深度不超过a的深度+k。因为问题可以离线,随便用棵平衡树和线段树合并一下就可以维护size信息了。
因为内存比较富裕,我写的是线段树合并。
#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: 谈笑风生相关推荐

  1. Bzoj3653 谈笑风生

    Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 753  Solved: 295 Description 设T 为一棵有根树,我们做如下的定义: • ...

  2. COGS 2211. [BZOJ3653]谈笑风生

    ★★★★   输入文件:laugh.in   输出文件:laugh.out   简单对比 时间限制:3 s   内存限制:512 MB [问题描述] 设T 为一棵有根树,我们做如下的定义: • 设a和 ...

  3. 【总结】一些简单线段树题目的口胡题解

    bzoj1645 离散化+扫描线 tyvj1473 校门外的树3 思维僵化(非要套离线枚举右端点然而不好做)系列,直接容斥求不与[l,r][l,r][l,r]相交的线段个数即可 bzoj3653谈笑风 ...

  4. 【BZOJ3653】谈笑风生 离线+树状数组+DFS序

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

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

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

  6. 【bzoj3653】谈笑风生

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

  7. [BZOJ3653][长链剖分]谈笑风生

    BZOJ3653 我也不知道题面的引申意义 发现可以求出以每个点为p时的ans,讨论一下祖先和子孙的贡献,用长链剖分维护就好了 Code: #include<bits/stdc++.h> ...

  8. [FROM WOJ]#4317 谈笑风生

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

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

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

最新文章

  1. GRE词汇乱序版-夹生的词汇2
  2. 大型网站HTTPS实践:HTTPS对性能的影响
  3. wordpress主题-一款功能强大的综合类型wordpress模板
  4. python n个list如何组成矩阵_有序矩阵中第K小的元素amp;x的平方根(二分法篇)
  5. bzoj3993 [SDOI2015]星际战争 二分答案+网络流检验
  6. 李国庆三位姐姐加入战局 正面刚俞渝:如继续侮辱我们,也将抓破你的脸!
  7. gdb调试mpi程序
  8. ts高仿C#的List、Dictionary
  9. 中科院计算机考研对外调剂吗,考研调剂信息:2020年中科院接收调剂研究生!...
  10. java密码加密方式_我去,同事居然用明文存储密码!!!
  11. 重新编译PHP加载PDO模块
  12. GAN里面的Kullback-Leibler Divergence和Jensen–Shannon Divergence
  13. 人脸识别摄像头与普通摄像头的区别
  14. 初识powerpoint的计算机教案,初识ppt教案.doc
  15. GMT5SAR--由*.grd文件生成*.ps
  16. 如何编写出优秀的代码
  17. 咏南开发框架之日志管理
  18. 通过Flex布局设置水平垂直居中
  19. c语言输入学号查找成绩,C语言程序设计按学号查询成绩
  20. 『迷你教程』识别人类活动的一维卷积神经网络模型,附完整代码

热门文章

  1. 基于Python实现相关分析案例
  2. Git教程_1 简介
  3. NAT-PT (Network Address Translation-Protocol)网络地址转换协议转换
  4. oracle样例数据库,创建和准备Oracle样例数据库
  5. Jupyter Notebook 代码补全功能配置
  6. scala数组入门到熟悉
  7. Windows核心编程MFC_gdi+发光字
  8. [转] Noise Contrastive Estimation 噪声对比估计 资料
  9. pdf png 转换超清
  10. 中科院合肥物质科学研究院葛运建团队: 智能机器人带来更美好生