★★★★   输入文件:laugh.in   输出文件:laugh.out   简单对比
时间限制:3 s   内存限制:512 MB

【问题描述】

设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。

【输入格式】

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

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

laugh.in

5 3

1 2

1 3

2 4

4 5

2 2

4 1

2 3

laugh.out

3

1

3

数据范围 n<=300,000吧

主席树+dfs序

从要求看来,可以划分成两种情况:

1.b比a高明且a和b谈笑风生,那么c只需在a的子树中取就好了,此时贡献为size[p]*min(dep[p-1],k)

2.a比b高明且a和b谈笑风生,c在b的子树上,考虑到子树问题,想到dfs序,那么问题变为求子树a区间中深度在deep[p]+1~deep[p]+k中所有点size的和 ,这可以用主席树完成

屠龙宝刀点击就送

#include <ctype.h>
#include <vector>
#include <cstdio>
#define N 305000
typedef long long LL;using std::vector;
struct cmt
{int l,r;LL Size;
}tr[N*20];
inline void Read(int &x)
{register char ch=getchar();for(x=0;!isdigit(ch);ch=getchar());for(;isdigit(ch);x=x*10+ch-'0',ch=getchar());
}
LL ans;
int min(int a,int b) {return a>b?b:a;}
int max(int a,int b) {return a>b?a:b;}
vector<int>edge[N];
int t[N],dfn[N],l[N],r[N],n,q,dep[N],tim,siz[N],tot;
void dfs(int x,int fa)
{l[x]=++tim;dfn[tim]=x;dep[x]=dep[fa]+1;siz[x]=0;for(int i=0;i<edge[x].size();++i){int v=edge[x][i];if(v!=fa){dfs(v,x);siz[x]+=siz[v]+1;}}r[x]=tim;
}
void update(int l,int r,int x,int &y,int a,int b)
{y=++tot;tr[y].Size=tr[x].Size+b;if(l==r) return;tr[y].l=tr[x].l;tr[y].r=tr[x].r;int mid=(l+r)>>1;if(a<=mid) update(l,mid,tr[x].l,tr[y].l,a,b);else update(mid+1,r,tr[x].r,tr[y].r,a,b);
}
LL ask(int l,int r,int x,int y,int a,int b)
{if(l==a&&r==b) return tr[y].Size-tr[x].Size;int mid=(l+r)>>1;if(a>mid) return ask(mid+1,r,tr[x].r,tr[y].r,a,b);else if(b<=mid) return ask(l,mid,tr[x].l,tr[y].l,a,b);else return ask(l,mid,tr[x].l,tr[y].l,a,mid)+ask(mid+1,r,tr[x].r,tr[y].r,mid+1,b);
}
int main(int argc,char *argv[])
{freopen("laugh.in","r",stdin);freopen("laugh.out","w",stdout);Read(n);Read(q);for(int u,v,i=1;i<n;++i){Read(u);Read(v);edge[u].push_back(v); edge[v].push_back(u); }dfs(1,1);for(int i=1;i<=n;++i) update(1,n,t[i-1],t[i],dep[dfn[i]],siz[dfn[i]]);for(int p,k;q--;){Read(p);Read(k);ans=0;ans=(LL)siz[p]*min(dep[p]-1,k);if(dep[p]!=n) ans+=ask(1,n,t[l[p]-1],t[r[p]],dep[p]+1,min(n,dep[p]+k));printf("%lld\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/ruojisun/p/7405808.html

COGS 2211. [BZOJ3653]谈笑风生相关推荐

  1. 数据结构(主席树):COGS 2211. 谈笑风生

    2211. 谈笑风生 ★★★★   输入文件:laugh.in   输出文件:laugh.out   简单对比 时间限制:3 s   内存限制:512 MB [问题描述] 设T 为一棵有根树,我们做如 ...

  2. BZOJ3653: 谈笑风生

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

  3. Bzoj3653 谈笑风生

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

  4. linux命令大全私房菜,41个linux命令大全(鸟哥的私房菜)

    转http://www.xmws.cn/show-87-419-1.html 41个linux命令大全 发布作者:微思网络   发布时间:2017-01-10   浏览量:709次 学过linux的人 ...

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

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

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

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

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

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

  8. 【bzoj3653】谈笑风生

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

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

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

最新文章

  1. 操作系统常用词典(三)
  2. 【结合实例】信息增益的计算
  3. 17-TypeScript代理模式
  4. LevelDB原理及应用
  5. html select选择事件_一道搜狗面试题:IO多路复用中select、poll、epoll之间的区别...
  6. div内容用html语言写,html – 使用DIV作为另一个元素的背景
  7. DDL/DML/DCL/TCL基本概念
  8. redisTemplate批量写入数据
  9. 插入网站连接_网站开发与网页制作
  10. 模板方法模式-Template Method Pattern
  11. 计算机文字录入在线打字,汉字输入方法-在线打字吧-在线拼音五笔打字练习软件,中文录入打字软件...
  12. Mac 下的代码比对工具
  13. FBA4droid 模拟器
  14. 项目管理可参考华为这10张表格
  15. 【国产替代】推动安全芯片产业国产化,华秋电子与华翼微达成合作!
  16. XCode使用googletest(包括googlemock)
  17. 切比雪夫插值多项式在非线性电路中的应用与比较
  18. 广州种植牙价格是多少
  19. Elasticsearch:在 Java 客户端中使用 scroll 来遍历搜索结果 - Elastic Stack 8.x
  20. STM32C8T6编码器电机测速与arduino光电模块测速

热门文章

  1. 用Seam-gen起步(二)
  2. 中创软件哪个部分是外包_什么是外包| 第1部分
  3. 解决:Activiti7与SpringBoot整合时,默认生成的activiti数据库中只有17张表,无另外8张历史表
  4. word的链接到前一节消失
  5. 专家议微软黑屏:目的正当 手段未必正当
  6. 高德地图基于阿里云MaxCompute的最佳实践
  7. 【C/C++基础进阶系列】实战记录 -- Dump 文件生成与分析
  8. 微信企业号接入微信支付
  9. 基于JAVA环巢湖区域旅游网站计算机毕业设计源码+数据库+lw文档+系统+部署
  10. 基于ONVIF协议的(IPC)客户端程序开发-10 设备校时