2211. 谈笑风生

★★★★   输入文件: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

好题就要分享,若本题作者认为侵权,请告知我,我会尽快删除。

作者:TenderRun

  这道题目一看就是要用某种数据结构的。

  观察它的询问:有两类情况

    ①:b点是a点祖先,可以O(1)求出答案。

    ②:b是a子树中的一个节点,我们可以用DFS序,那么b点所在子树就是DFS序列中连续的一段,考虑对子树分层,接着用主席树水过了。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <queue>
 5 using namespace std;
 6 const int maxn=300010;
 7 int cnt,fir[maxn],nxt[maxn<<1],to[maxn<<1];
 8 void addedge(int a,int b){
 9     nxt[++cnt]=fir[a];
10     fir[a]=cnt;
11     to[cnt]=b;
12 }
13 int dep[maxn],sz[maxn],ID[maxn],end[maxn],tot;
14 void DFS(int node){
15     sz[node]=1;ID[node]=++tot;
16     for(int i=fir[node];i;i=nxt[i]){
17         if(dep[to[i]])continue;
18         dep[to[i]]=dep[node]+1;
19         DFS(to[i]);
20         sz[node]+=sz[to[i]];
21     }
22     end[node]=tot;
23 }
24 queue<int>q;
25 int rt[maxn],ch[maxn*30][2],cont;
26 long long tr[maxn*30];
27 void Insert(int pre,int &rt,int l,int r,int g){
28     rt=++cont;
29     ch[rt][0]=ch[pre][0];
30     ch[rt][1]=ch[pre][1];
31     tr[rt]=tr[pre]+sz[g]-1;
32     if(l==r)return;
33     int mid=(l+r)>>1;
34     if(ID[g]<=mid)Insert(ch[pre][0],ch[rt][0],l,mid,g);
35     else Insert(ch[pre][1],ch[rt][1],mid+1,r,g);
36 }
37 long long Query(int pre,int rt,int l,int r,int a,int b){
38     if(l>=a&&r<=b)return tr[rt]-tr[pre];
39     int mid=(l+r)>>1;
40     long long ret=0;
41     if(mid>=a)ret=Query(ch[pre][0],ch[rt][0],l,mid,a,b);
42     if(mid<b)ret+=Query(ch[pre][1],ch[rt][1],mid+1,r,a,b);
43     return ret;
44 }
45 int main(){
46     freopen("laugh.in","r",stdin);
47     freopen("laugh.out","w",stdout);
48     int n,Q;
49     scanf("%d%d",&n,&Q);
50     for(int i=1,a,b;i<n;i++){
51         scanf("%d%d",&a,&b);
52         addedge(a,b);
53         addedge(b,a);
54     }
55     dep[1]=1;
56     DFS(1);
57     q.push(1);
58     int maxd=0;
59     while(!q.empty()){
60         int node=q.front();q.pop();maxd=max(maxd,dep[node]);
61         if(!rt[dep[node]])Insert(rt[dep[node]-1],rt[dep[node]],1,n,node);
62         else Insert(rt[dep[node]],rt[dep[node]],1,n,node);
63         for(int i=fir[node];i;i=nxt[i]){
64             if(dep[to[i]]!=dep[node]+1)continue;
65             q.push(to[i]);
66         }
67     }
68     int a,k;
69     long long ans;
70     while(Q--){
71         scanf("%d%d",&a,&k);
72         ans=1ll*(min(k,dep[a]-1))*(sz[a]-1);
73         ans+=Query(rt[dep[a]],rt[min(dep[a]+k,maxd)],1,n,ID[a],end[a]);
74         printf("%lld\n",ans);
75     }
76     return 0;
77 }

转载于:https://www.cnblogs.com/TenderRun/p/5356795.html

数据结构(主席树):COGS 2211. 谈笑风生相关推荐

  1. [主席树] 湖南集训 谈笑风生

    传送门 一.做法 CCC一定是A,BA, BA,B公共子树里的点 B在A上方 则C一定在A子树中 ans=min⁡{k,dep[A]−1}×(siz[A]−1)ans=\min\{k,dep[A]-1 ...

  2. 数据结构----主席树

    这两天一直在看各种树~划分树,左偏树,主席树,伸展树~~~好乱~~ 一听到主席树这个名字的时候感觉好奇怪,为什么会叫主席树,感觉好难好高大上,所以一直敬而远之,,,,,主席树是一个大牛的拼音缩写HJT ...

  3. 数据结构 - 主席树

    文章目录 好文推荐 求区间第K大 [模板]可持久化线段树 1(主席树) 题目 代码 可持久化数组 [模板]可持久化数组(可持久化线段树/平衡树) 好文推荐 权值线段树.主席树学习 树状结构之主席树 求 ...

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

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

  5. 【主席树】可持久化数组(金牌导航 可持久化数据结构-3)

    可持久化数组 金牌导航 可持久化数据结构-3 题目大意 给出一个序列a,让你执行若干操作,操作分为两种: 1.继承第v次操作后把第x个数改成y 2.查询第v次操作的第x个数的值 输入样例 5 10 5 ...

  6. 浅谈数据结构之主席树(线段树进阶版)

    今天看了点主席树的概念,加上飞哥上次讲的,目前对主席树有了大致的了解,简单谈谈吧,不讲代码,只讲思路,日后贴题! Orz高级数据结构发明者主席!!最早在CLJ的课件里第一次看到了这个词,最近做区间第K ...

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

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

  8. COGS 930. [河南省队2012] 找第k小的数 主席树

    主席树裸板子 #include<cstdio> #include<iostream> #include<algorithm> #define MAXN 100005 ...

  9. P3899 [湖南集训]谈笑风生 主席树解决二维数点

    传送门 文章目录 题意: 思路: 题意: 思路: 由于a,ba,ba,b都比ccc厉害,那么a,ba,ba,b一定是某个是某个的祖先.那么就分为两种情况了: (1)(1)(1) bbb在aaa上面,约 ...

最新文章

  1. Java 中 Comparable 接口的意义和用法.
  2. 类方法与静态方法的进一步理解
  3. 深入理解Netty高性能网络框架
  4. Update resources 和 Update classes and resources 的特殊情况
  5. 关于Tomcat文件下载中文名乱码现象
  6. 给路灯按上“电话卡”,从此不仅只照明还给管理员“打电话”
  7. 浅谈压缩感知(十六):感知矩阵之RIP
  8. Uva 11054 - Wine trading in Gergovia(模拟)
  9. linux基础命令一、
  10. Sql loader使用教程
  11. 【经验分享】F e n c e s 桌面布局软件(Win All)----中文免费版+教程
  12. 数学建模-Logistic模型
  13. Kruskal vs Borůvka
  14. html中input type什么意思,HTML中type是什么意思
  15. LeedCode 24:两两交换链表中的节点
  16. 从Google Play上下载apk
  17. 【Pranet】论文及代码解读(ResNet部分)——jialiang nie
  18. 夏普电视android应用程序,教你解决夏普电视出现的“应用程序未安装”问题
  19. 对英国房屋价格建模并预测 ---《量化金融R语言初级教程》
  20. OutputStreamWriter的基本使用

热门文章

  1. 解决java poi生成word文件格式错误的问题。
  2. Oracle 9i 10g编程艺术-深入数据库体系结构——第3章:文件
  3. Java语言汉语转换为拼音
  4. nio.charset.UnsupportedCharsetException 解决
  5. AUTOSAR知识点Com(十一):CANSM工具配置
  6. 蓝牙数据接收模块—虚拟示波器
  7. 面向5G行业应用的OpenUPF及关键技术
  8. python随机模块 无范围_Python模块:生成随机数模块random
  9. 相比阿里、腾讯云,金山云有哪些优势?
  10. IT项目管理:IT项目集成管理