BZOJ3653谈笑风生——可持久化线段树+dfs序
题目描述
输入
输出
输出 q 行,每行对应一个询问,代表询问的答案。
样例输入
1 2
1 3
2 4
4 5
2 2
4 1
2 3
样例输出
1
3
提示
Hint:边要加双向
题目大意:给定一个n个节点的有根树,q次询问,每次询问两个数p,k,问满足1、a,b都是c的祖先。2、a编号为p。3、a,b距离<=k。的三元组(a,b,c)有多少个。
因为a,b都是c的祖先,所以它们其中一个一定是另一个的祖先。a的位置确定了,那就讨论b的位置:当b是a祖先时,直接将a子树大小乘上k和a的深度中小的那个就好了;当a是b祖先时,a子树中与a深度差<=k的点都可以是b,统计这些点的子树和就是答案,也就相当于将每个点的子树大小作为这个点的点权(要将自己刨去)求点权和。如果没有层数限制直接将dfs序架在线段树上区间求和就好了。但有了限制就要用主席树按深度建树,每个深度建一棵线段树,维护这一深度所有点的信息,查询时依旧是查a点子树区间,但因为深度>dep[a]+k的点在主席树中还没有维护信息所以并不影响。
- #include<set>
- #include<map>
- #include<queue>
- #include<cmath>
- #include<stack>
- #include<vector>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- typedef long long ll;
- using namespace std;
- ll ans;
- int mx;
- int n,m;
- int p,k;
- int x,y;
- int num;
- int tot;
- int cnt;
- int s[300010];
- int t[300010];
- int d[300010];
- int to[600010];
- int ls[6000010];
- int rs[6000010];
- ll sum[6000010];
- int head[300010];
- int next[600010];
- int size[300010];
- int root[300010];
- struct node
- {
- int dep;
- int id;
- }a[300010];
- bool cmp(node a,node b)
- {
- return a.dep<b.dep;
- }
- void add(int x,int y)
- {
- tot++;
- next[tot]=head[x];
- head[x]=tot;
- to[tot]=y;
- }
- void dfs(int x,int fa)
- {
- num++;
- s[x]=num;
- a[x].dep=a[fa].dep+1;
- d[x]=d[fa]+1;
- size[x]=1;
- for(int i=head[x];i;i=next[i])
- {
- if(to[i]!=fa)
- {
- dfs(to[i],x);
- size[x]+=size[to[i]];
- }
- }
- t[x]=num;
- }
- int updata(int pre,int l,int r,int k,int v)
- {
- int rt=++cnt;
- if(l==r)
- {
- sum[rt]=sum[pre]+v;
- return rt;
- }
- ls[rt]=ls[pre];
- rs[rt]=rs[pre];
- sum[rt]=sum[pre]+v;
- int mid=(l+r)>>1;
- if(k<=mid)
- {
- ls[rt]=updata(ls[pre],l,mid,k,v);
- }
- else
- {
- rs[rt]=updata(rs[pre],mid+1,r,k,v);
- }
- return rt;
- }
- ll query(int x,int y,int l,int r,int L,int R)
- {
- if(L<=l&&r<=R)
- {
- return sum[y]-sum[x];
- }
- int mid=(l+r)>>1;
- if(L>mid)
- {
- return query(rs[x],rs[y],mid+1,r,L,R);
- }
- else if(R<=mid)
- {
- return query(ls[x],ls[y],l,mid,L,R);
- }
- return query(ls[x],ls[y],l,mid,L,R)+query(rs[x],rs[y],mid+1,r,L,R);
- }
- int main()
- {
- scanf("%d%d",&n,&m);
- for(int i=1;i<n;i++)
- {
- scanf("%d%d",&x,&y);
- add(x,y);
- add(y,x);
- a[i].id=i;
- }
- a[n].id=n;
- dfs(1,0);
- sort(a+1,a+1+n,cmp);
- for(int i=1;i<=n;i++)
- {
- mx=max(mx,d[i]);
- if(a[i].dep>a[i-1].dep)
- {
- root[a[i].dep]=root[a[i-1].dep];
- }
- root[a[i].dep]=updata(root[a[i].dep],1,n,s[a[i].id],size[a[i].id]-1);
- }
- for(int i=1;i<=m;i++)
- {
- scanf("%d%d",&p,&k);
- ans=0;
- ans+=1ll*min(k,d[p]-1)*(size[p]-1);
- ans+=query(root[d[p]],root[min(d[p]+k,mx)],1,n,s[p],t[p]);
- printf("%lld\n",ans);
- }
- }
BZOJ3653谈笑风生——可持久化线段树+dfs序的更多相关文章
- Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序
题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s 内存限制:512.0MB 总提交次数:196 AC次数:65 平均分: ...
- 【CF768G】The Winds of Winter 可持久化线段树 DFS序
题目大意 给定一棵\(n\)个点的树,对于树上每个结点,将它删去,然后可以将得到的森林中任意一个点与其父亲断开并连接到另一颗树上,对每一个点求出森林中所有树\(size\)最大值的最小值. \(n\l ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
- 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序
题目大意 Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...
- 【bzoj4817】树点涂色 LCT+线段树+dfs序
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- S - Query on a tree HDU - 3804 线段树+dfs序
S - Query on a tree HDU - 3804 离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...
- bzoj 3653: 谈笑风生 可持久化线段树
题目大意 在一棵单位边权的有根树上支持询问: 给定a,k求满足下列条件的有序三元对的个数. a,b,c互不相同 a,b均为c的祖先 a,b树上距离<=k 题解 solution 1 首先我们知道 ...
- HDU 5692 线段树+dfs序
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
随机推荐
- 【Codeforces 1105E】Helping Hiasat
Codeforces 1105 E 题意:给你m个事件,每个事件可能是以下两种之一: \(1\),代表此时可以更改用户名 \(2\) \(s\),代表\(s\)来查看是否用户名与其名字相符 一共有\( ...
- Selenium:WebDriver简介及元素定位
参考内容:官方API文档,下载链接:http://download.csdn.net/detail/kwgkwg001/4004500 虫师:<selenium2自动化测试实战-基于python ...
- GZIP压缩提高网络传输效率
[spring]通过GZIP压缩提高网络传输效率(可以实现任何资源的gzip压缩.包括AJAX) gzip是http协议中使用的一种加密算法,客户端向web服务器端发出了请求后,通常情况下服务器端会将 ...
- C++11 并发指南二(std::thread 详解)
上一篇博客<C++11 并发指南一(C++11 多线程初探)>中只是提到了 std::thread 的基本用法,并给出了一个最简单的例子,本文将稍微详细地介绍 std::thread 的用 ...
- 解密:Python风靡全宇宙,首要原因竟是它?
就让我们从近年来大数据的兴起说起,为你娓娓道来Python火爆的真正原因. 郁闷的大数据程序员 随着大数据的崛起,大多数行业发现自己进入了一种恐慌状态:他们花费了大量的时间和金钱来建立他们的大数据渠道 ...
- 4.5《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)—第四章小结
本章相关重要命令总结在Table 6. 命令 描述 示例 mkdir <name> 创建某目录 $ mkdir foo pwd 显示当前所在目录 $ pwd cd <dir> ...
- AngularJs的ng-include的使用与实现
想在angularjs动态加载一个内容,我们可以使用ng-include来实现. 今天Insus.NET就在ASP.NET MVC环境中,举个例子来演示它的功能. 你可以在一个视图动态加载任一其它视图 ...
- flask_admin 笔记七 扩展功能
高级功能 1,开启CSRF保护 要将CSRF保护添加到由ModelView实例生成的表单中,请通过指定form_base_class参数在ModelView子类中使用SecureForm类: from ...
- SpringMvc返回Json调试
spring-web-5.0.6.RELEASE.jar!/org/springframework/web/method/support/HandlerMethodReturnValueHandler ...
- mongo java 踩坑记
为什么会有这么多坑 1. Java会把 id:String = "合法ObjectId" 好心好意的 转为 _id:ObjectId 类型. 2. 为了避免第1点, 我定义了 ...