数据结构(主席树):COGS 2211. 谈笑风生
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. 谈笑风生相关推荐
- [主席树] 湖南集训 谈笑风生
传送门 一.做法 CCC一定是A,BA, BA,B公共子树里的点 B在A上方 则C一定在A子树中 ans=min{k,dep[A]−1}×(siz[A]−1)ans=\min\{k,dep[A]-1 ...
- 数据结构----主席树
这两天一直在看各种树~划分树,左偏树,主席树,伸展树~~~好乱~~ 一听到主席树这个名字的时候感觉好奇怪,为什么会叫主席树,感觉好难好高大上,所以一直敬而远之,,,,,主席树是一个大牛的拼音缩写HJT ...
- 数据结构 - 主席树
文章目录 好文推荐 求区间第K大 [模板]可持久化线段树 1(主席树) 题目 代码 可持久化数组 [模板]可持久化数组(可持久化线段树/平衡树) 好文推荐 权值线段树.主席树学习 树状结构之主席树 求 ...
- 洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)
题目链接:点击查看 题目大意:设 TTT 为一棵有根树,我们做如下的定义: 设 aaa 和 bbb 为 TTT 中的两个不同节点.如果 aaa 是 bbb 的祖先,那么称"aaa 比 bbb ...
- 【主席树】可持久化数组(金牌导航 可持久化数据结构-3)
可持久化数组 金牌导航 可持久化数据结构-3 题目大意 给出一个序列a,让你执行若干操作,操作分为两种: 1.继承第v次操作后把第x个数改成y 2.查询第v次操作的第x个数的值 输入样例 5 10 5 ...
- 浅谈数据结构之主席树(线段树进阶版)
今天看了点主席树的概念,加上飞哥上次讲的,目前对主席树有了大致的了解,简单谈谈吧,不讲代码,只讲思路,日后贴题! Orz高级数据结构发明者主席!!最早在CLJ的课件里第一次看到了这个词,最近做区间第K ...
- COGS 2211. [BZOJ3653]谈笑风生
★★★★ 输入文件:laugh.in 输出文件:laugh.out 简单对比 时间限制:3 s 内存限制:512 MB [问题描述] 设T 为一棵有根树,我们做如下的定义: • 设a和 ...
- COGS 930. [河南省队2012] 找第k小的数 主席树
主席树裸板子 #include<cstdio> #include<iostream> #include<algorithm> #define MAXN 100005 ...
- P3899 [湖南集训]谈笑风生 主席树解决二维数点
传送门 文章目录 题意: 思路: 题意: 思路: 由于a,ba,ba,b都比ccc厉害,那么a,ba,ba,b一定是某个是某个的祖先.那么就分为两种情况了: (1)(1)(1) bbb在aaa上面,约 ...
最新文章
- 利用Python进行数据分析 Note 1
- linux diff patch 生成和打补丁
- 常用Jquery前端操作
- R语言中dim函数_R语言--向量化计算(apply族函数)
- 一图搞定ML!2020版机器学习技术路线图,35页ppt
- springboot(八):RabbitMQ详解
- 嵌入式电路设计(soc底板电路设计)
- du -sh 如何找到最大的文件夹_线上故障如何快速排查?来看这套技巧大全
- c语言有结构体的200行代码,C语言——结构体(示例代码)
- atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表
- VCF vs Maf | 变异注释及整理为Maf格式
- 遗传算法适应度计算函数——ranking
- 1075:字符串统计
- windows中nginx.exe注册为系统服务
- 2020最火网络新词英文_2020年最流行的话 2020最火网络新词
- JSP 手机销售管理系统 myeclipse开发web网页 mysql数据库
- usleep java_sleep()和usleep()的使用和区别
- 【微信小程序】-- WXML 模板语法 - 数据绑定(九)
- Android-第九节网络编程
- ElasticSearchTransportClient集成SearchGuard插件实现索引级别的权限管控
热门文章
- Simplify the Usage of Lexicon in Chinese NER阅读笔记
- 牛客-计算机考研复试上机题-二次方程计算器
- C++训练-角谷猜想
- 第七城市开源奇迹mu_2014年:开源奇迹年
- 刀剑无双服务器显示404,刀剑无双9月18日服务器维护更新公告
- ElasticSearch(五)SpringBoot+ES+Jsoup实现JD(京东)搜索
- 推荐不错的软件测试微信公众号
- 【码农学编曲】血清合成器Xfer Serum
- 抖音很多人给女朋友准备的表白特效
- 佳能邮箱服务器,如何指定发送设置(电子邮件/ 文件服务器) (MF4680)