P3899 [湖南集训]谈笑风生 主席树
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define per(i,j,k) for(int i=j;i>=k;i--)
#define LL long long
using namespace std;
const int maxx = 3e5+;
struct node{
int l,r;
LL val;
}tree[maxx<<];
int ver[maxx*],Next[maxx*],head[maxx];
///邻接表
int deapth[maxx],Size[maxx],dfn[maxx],root[maxx];
///深度数组 包含自己在内的子节点数目 DFS序 主席树的根
int tot,order,deep,cnt;
///边的序号 DFS序标记 最深深度
void add(int x,int y){
ver[++tot]=y;Next[tot]=head[x];head[x]=tot;
ver[++tot]=x;Next[tot]=head[y];head[y]=tot;
}
void inserts(int l,int r,int pre,int &now,int pos,LL val){
///动态开点部分
now=++cnt;
///把旧的节点的信息更新到新的节点上
tree[now]=tree[pre];
///维护前缀和
tree[now].val+=val;
if (l==r){
return;
}
int mid=(l+r)>>;
if (pos<=mid){
inserts(l,mid,tree[pre].l,tree[now].l,pos,val);
}else {
inserts(mid+,r,tree[pre].r,tree[now].r,pos,val);
}
}
LL query(int L,int R,int l,int r,int ql,int qr){
LL ans=;
///如果在范围内,直接返回
if (ql<=l && r<=qr){
return tree[R].val-tree[L].val;
}
int mid=(l+r)>>;
if(ql<=mid)ans+=query(tree[L].l,tree[R].l,l,mid,ql,qr);
if(qr>mid)ans+=query(tree[L].r,tree[R].r,mid+,r,ql,qr);
return ans;
}
void dfs1(int x,int fa){
Size[x]=;
deapth[x]=deapth[fa]+;
///更新最深是深度
deep=max(deep,deapth[x]);
for(int i=head[x];i;i=Next[i]){
if(ver[i]==fa)continue;
dfs1(ver[i],x);
Size[x]+=Size[ver[i]];
}
}
void dfs2(int x,int fa){
dfn[x]+=++order;
///这里注意,由于我们需要按照树的变量顺序来建立序列,所以应该是root[order-1],root[order]
///size减1是为了减去自己
inserts(,deep,root[order-],root[order],deapth[x],Size[x]-);
for (int i=head[x];i;i=Next[i]){
if(ver[i]==fa)continue;
dfs2(ver[i],x);
}
}
int main(){
int n,q;
int uu,vv,l,r;
while(~scanf("%d%d",&n,&q)){
order=;
deep=;
cnt=;
memset(Next,,sizeof(Next));
memset(Size,,sizeof(Size));
memset(dfn,,sizeof(dfn));
memset(deapth,,sizeof(deapth));
rep(i,,n-){
scanf("%d%d",&uu,&vv);
add(uu,vv);
}
dfs1(,);
dfs2(,);
LL ans=;
int p,k;
while(q--){
scanf("%d%d",&p,&k);
ans=;
///当a点在b点的的下面,那么b所处于的位置,应该是其a的深度和k当中小的那个
///因为b只会在a的上面k个位置,并且如果a的深度太小的话,其深度可能达不到k个
///C的位置的可能一定是a的子节点
ans+=(LL)(Size[p]-)*min(k,deapth[p]-);
///当b点在a的下端,那么c应该在b的子节点中
///所以我们要查询a也就是p的子节点中 所以第一个范围oot[dfn[p]-1],root[dfn[p]+Size[p]-1]
///查询其子节点中深度在deepth[p]+1到death[p]+k的节点中子节点的个数和
///因为我们构架线段树的时候,构建的是前缀和
ans+=query(root[dfn[p]-],root[dfn[p]+Size[p]-],,deep,deapth[p]+,min(deapth[p]+k,deep));
if (deapth[p]==deep)ans=;
printf("%lld\n",ans);
}
}
return ;
}
P3899 [湖南集训]谈笑风生 主席树的更多相关文章
- [Luogu P3899] [湖南集训]谈笑风生 (主席树)
题面 传送门:https://www.luogu.org/problemnew/show/P3899 Solution 你们搞的这道题啊,excited! 这题真的很有意思. 首先,我们可以先理解一下 ...
- luogu P3899 [湖南集训]谈笑风生 线段树合并
Code: #include<bits/stdc++.h> #define maxn 300002 #define ll long long using namespace std; vo ...
- 洛谷P3899 [湖南集训]谈笑风生(线段树合并)
题意 题目链接 Sol 线段树合并板子题,目前我看到两种写法,分别是这样的. 前一种每次需要新建一个节点,空间是\(O(4nlogn)\) 后者不需要新建,空间是\(O(nlogn)\)(面向数据算空 ...
- 主席树 || 可持久化线段树 || BZOJ 3653: 谈笑风生 || Luogu P3899 [湖南集训]谈笑风生
题面:P3899 [湖南集训]谈笑风生 题解: 我很喜欢这道题. 因为A是给定的,所以实质是求二元组的个数.我们以A(即给定的P)作为基点寻找答案,那么情况分两类.一种是B为A的父亲,另一种是A为B的 ...
- luogu P3899 [湖南集训]谈笑风生
传送门 nmyzd,mgdhls,bnmbzdgdnlql,a,wgttxfs 对于一个点\(a\),点\(b\)只有可能是他的祖先或者在\(a\)子树里 如果点\(b\)是\(a\)祖先,那么答案为 ...
- P3899 [湖南集训]谈笑风生
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3653 https://www.luogu.org/problemnew/show/P38 ...
- 【洛谷 P3899】 [湖南集训]谈笑风生 (主席树)
题目链接 容易发现\(a,b,c\)肯定是在一条直链上的. 定义\(size(u)\)表示以\(u\)为根的子树大小(不包括\(u\)) 分两种情况, 1.\(b\)是\(a\)的祖先,对答案的贡献是 ...
- bzoj 3653 [湖南集训]谈笑风生
题目描述 设 T 为一棵有根树,我们做如下的定义: • 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称"a 比 b 不知道高明到哪里去了". • 设 a ...
- Luogu 3899 [湖南集训]谈笑风生
BZOJ 3653权限题. 这题方法很多,但我会的不多…… 给定了$a$,我们考虑讨论$b$的位置: 1.$b$在$a$到根的链上,那么这样子$a$的子树中的每一个结点(除了$a$之外)都是可以成为$ ...
随机推荐
- console.js还有浏览器不支持?
今天看到项目中引入了一个插件,我超级惊讶 为什么引入console.js啊? 这个是插件的源码:https://github.com/yanhaijing/console.js 我搜到源作者对这个插件 ...
- 一款你不容错过的Laravel后台管理扩展包 —— Voyager – Laravel学院
1.简介 Voyager是一个你不容错过的Laravel后台管理扩展包,提供了CRUD操作.媒体管理.菜单构建.数据管理等操作. 官网:https://the-control-group.github ...
- 杨柳絮-Info:阜阳市多举措治理杨柳絮问题
ylbtech-杨柳絮-Info:阜阳市多举措治理杨柳絮问题 1.返回顶部 1. 阜阳市多举措治理杨柳絮问题 2019-4-15 10:34| 发布者: 戴斐 | 查看: 56407| 评论: 0|原 ...
- Openck_Swift源代码分析——添加、删除设备时算法详细的实现过程
1 初始加入设备后.上传Object的详细流程 前几篇博客中,我们讲到环的基本原理即详细的实现过程,加入我们在初始创建Ring是执行例如以下几条命令: •swift-ring-builder obj ...
- cnn.py cs231n
n import numpy as np from cs231n.layers import * from cs231n.fast_layers import * from cs231n.layer_ ...
- 2018-8-10-C#-不能用于文件名的字符
title author date CreateTime categories C# 不能用于文件名的字符 lindexi 2018-08-10 19:16:52 +0800 2018-02-22 1 ...
- 51nod1040 矩阵相乘结果的判断
给出三个N*N的矩阵A, B, C,问A * B是否等于C?Input第1行,1个数N.(0 <= N <= 500)第2 - N + 1行:每行N个数,对应矩阵A的元素.(0 <= ...
- R语言因子
R语言因子 因子是它们用于将数据进行分类并将其存储为级别的数据对象.它们可以同时存储字符串和整数.它们在具有唯一值的有限数目的列是有用的. 例如,"male, "Female&qu ...
- springboot(十九)使用actuator监控应用【转】【补】
springboot(十九)使用actuator监控应用 微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的 ...
- utf8mb4 使用注意
数据库的表的定义如果是utf8mb4的富文本时,关联的字段必须指定为非utf8,否则 跟其他的表关联的时候,会非常慢,以至于索引都不能使用. 也就是必须的字段才可以使用这个 utf8mb4 ,否则检索 ...