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$之外)都是可以成为$ ...
随机推荐
- 查漏补缺·补丁计划
趁着神志清醒赶紧写一下. 多次考试暴露出各种问题.新的知识点先不去搞了,最近多做一些不擅长的类型的题查漏补缺一下吧. 唔,首先是比较考验思维的类型,我智商太低又刷题少不会什么套路,只能最近赶紧赶一下进 ...
- ubuntu安装搜狗输入法后无法使用goland的快捷键 ctrl+alt+B
安装了搜狗拼音后,其快捷键ctrl+alt+b会启动软键盘,造成与其他编辑器快捷键的冲突. 为了禁止使用ctrl+alt+b启动软键盘,可以: 1. 在搜狗拼音输入法选择设置 2. 高级设置 3. 高 ...
- bzoj 1191 [HNOI2006]超级英雄Hero——二分图匹配
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1191 不就是个最大匹配么. 结果WA得不行. 看TJ后发现题面上说了一旦没回答出一道题就结束 ...
- httpserver支持路由传输控制器
main.go package main import ( "net/http" "com.jtthink.net/myhttpserver/core" ) t ...
- 洛谷 P1567 统计天数【最长上升子序列/断则归一】
题目背景 统计天数 题目描述 炎热的夏日,KC非常的不爽.他宁可忍受北极的寒冷,也不愿忍受厦门的夏天.最近,他开始研究天气的变化.他希望用研究的结果预测未来的天气. 经历千辛万苦,他收集了连续N(1& ...
- tablespaces
select * from user_tablespaces; select username,default_tablespace from user_users;
- PLAY2.6-SCALA(十二) 表单的处理
一.表单处理流程如下 1.定义一个表单,在这里表单最多有22个字段 import play.api.data._ import play.api.data.Forms._ //要使用验证和约束 imp ...
- 【JZOJ4784】【NOIP2016提高A组模拟9.15】Map
题目描述 输入 输出 样例输入 4 4 2 1 2 2 3 3 2 3 4 1 2 1 4 样例输出 14 数据范围 样例解释 upd:保证原图连通. "不相交路径"的定义为不存在 ...
- 【数论】不定方程&逆元&中国剩余定理
一.不定方程 要求逆元,首先要知道什么是不定方程. 已知a,b,c,求解x,y,形如ax + by = c 的方程就是不定方程. 不定方程有两种解的情况: 1.无解 2.存在且有无限的解 那么,如何判 ...
- java定时(循环)执行一个方法
java中设置定时任务用Timer类可以实现. 一.延时执行 首先,我们定义一个类,给它取个名字叫TimeTask,我们的定时任务,就在这个类的main函数里执行.代码如下: package test ...