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] ...
随机推荐
- C语言程序设计II—第九周教学
第九周教学总结(22/4-28/4) 教学内容 本周的教学内容为: 9.1 输出平均分最高的学生信息 知识点:结构的概念.结构的定义形式.结构的嵌套定义.结构变量和结构成员变量的引用.重难点:结构变量 ...
- rook 入门理解
参考:https://my.oschina.net/u/2306127/blog/1830356?from=timeline 1.Rook通过一个操作器(operator)完成后续操作,只需要定义需要 ...
- FileShare枚举的使用(文件读写锁) - (转载)
开发过程中,我们往往需要大量与文件交互,但往往会出现很多令人措手不及的意外,所以对普通的C#文件操作做了一次总结,问题大部分如下: 写入一些内容到某个文件中,在另一个进程/线程/后续操作中要读取文件内 ...
- 窥看 SpringBoot 的原理与使用
一:SpringBoot的启动 1. 继承spring-boot-starter-parent项目 2. 导入spring-boot-dependencies项目依赖 二:Spring Boot 主类 ...
- BZOJ1767/Gym207383I CEOI2009 Harbingers 斜率优化、可持久化单调栈、二分
传送门--BZOJCH 传送门--VJ 注:本题在BZOJ上是权限题,在Gym里面也不能直接看,所以只能在VJ上交了-- 不难考虑到这是一个\(dp\). 设\(dep_x\)表示\(x\)在树上的带 ...
- JSON WEB TOKEN,简单谈谈TOKEN的使用及在C#中的实现
十年河东,十年河西,莫欺少年穷. 学无止境,精益求精. 突然发现整个十月份自己还没有写一篇博客......哎,说出来都是泪啊,最近加班实在实在实在是太多了,真的没有多余的时间写博客.这不,今天也在加班 ...
- P4770 [NOI2018]你的名字
蒟蒻表示不会sam凉凉了,所以只能提高SA技巧? 题意:有一个串\(A\),每次选择一个\(A\)的子串\(A'\),以及串\(B\),问\(B\)的所有本质不同子串中不在\(A'\)中的串的数量. ...
- 学习ML.NET(3): 导入数据集
机器学习算法需要作用于数据,用来训练算法模型.数据集通常是以纯文本文件存储的表格数据,文件的每一行是一条数据记录,每条记录由多列组成,列之间用分隔符(一般是逗号,)分开,例如前面用到过的鸢尾花数据集. ...
- keycloak 调研资料
1.https://www.keycloak.org/docs/latest/server_development/index.html 下载keycloak 2.https://gitee.com/ ...
- 画了一张基于Spring Cloud的微服务系统架构图