洛谷 P3899 [谈笑风生]
简化题意
m次询问,每次询问x的子树中,与x节点距离不超过y的节点的子树和。n,m≤300,000。
思路
按照dfs序排序,每次将一个点的答案塞到第depu的位置,这样得到一个前缀和,每次询问作减法即可。
可持久化线段树。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=3E5+;
typedef long long int ll;
ll n,m,x,y,sum[maxn],dep[maxn],cur,t[maxn*],root[maxn*],fa[maxn],size,gg;
ll ls[maxn*],rs[maxn*],ti,dfn[maxn],last[maxn],maxx[maxn],head[maxn*];
struct edge{ll to,next;}E[maxn*];
void insert(ll l,ll r,ll pos,ll&num,ll pre,ll val)
{
num=++cur;
t[num]=t[pre];
ls[num]=ls[pre];
rs[num]=rs[pre];
t[num]+=val;
if(l==r)return;
ll mid=(l+r)>>;
if(pos<=mid)insert(l,mid,pos,ls[num],ls[pre],val);
else insert(mid+,r,pos,rs[num],rs[pre],val);
}
ll ask(ll L,ll R,ll l,ll r,ll num)
{
if(L<=l&&r<=R)return t[num];
else if(r<L||R<l)return ;
ll mid=(l+r)>>;
return ask(L,R,l,mid,ls[num])+ask(L,R,mid+,r,rs[num]);
}
void add(ll u,ll v)
{
E[++size].to=v;
E[size].next=head[u];
head[u]=size;
}
void dfs(ll u,ll F,ll d)
{
dep[u]=d;
fa[u]=F;
sum[u]=;
maxx[u]=dfn[u]=++ti;
last[u]=u;
for(ll i=head[u];i;i=E[i].next)
{
ll v=E[i].to;
if(v==F)continue;
dfs(v,u,d+);
sum[u]+=sum[v];
if(maxx[v]>maxx[u])
{
maxx[u]=maxx[v];
last[u]=last[v];
}
}
}
void init(ll u,ll F,ll d)
{
insert(,n,d,root[u],root[gg],sum[u]-);
gg=u;
for(ll i=head[u];i;i=E[i].next)
{
ll v=E[i].to;
if(v==F)continue;
init(v,u,d+);
}
}
int main()
{
// freopen("laugh.in","r",stdin);
// freopen("laugh.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>m;
for(ll i=;i<=n-;++i)
{
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(,,);
gg=;
init(,,);
for(ll i=;i<=m;++i)
{
cin>>x>>y;
if(x==)cout<<ask(,+y,,n,root[last[]])<<endl;
else cout<<(sum[x]-)*min(dep[x]-,y)+
ask(dep[x]+,dep[x]+y,,n,root[last[x]])-ask(dep[x]+,dep[x]+y,,n,root[x])<<endl;
}
return ;
}
洛谷 P3899 [谈笑风生]的更多相关文章
- 【洛谷P3899】谈笑风生
题目大意:给定一棵 N 个节点的有根树,1 号节点为根节点,现给出 Q 个询问,每次询问距离 u 号节点不超过 K 的节点 b,c 为 a 与 b 的后代,求这样的三元组有多少个. 题解:学会了线段树 ...
- 洛谷P3899 [湖南集训]谈笑风生(线段树合并)
题意 题目链接 Sol 线段树合并板子题,目前我看到两种写法,分别是这样的. 前一种每次需要新建一个节点,空间是\(O(4nlogn)\) 后者不需要新建,空间是\(O(nlogn)\)(面向数据算空 ...
- 【洛谷 P3899】 [湖南集训]谈笑风生 (主席树)
题目链接 容易发现\(a,b,c\)肯定是在一条直链上的. 定义\(size(u)\)表示以\(u\)为根的子树大小(不包括\(u\)) 分两种情况, 1.\(b\)是\(a\)的祖先,对答案的贡献是 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
- 洛谷P1710 地铁涨价
P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...
- 洛谷P1371 NOI元丹
P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交 讨论 题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...
随机推荐
- iscroll4升级到iscroll5全攻略笔记
前段时间在搞移动终端(移动web)的项目,其中需要用到滚动的功能(html的滚动效果不好,且在低版本上不支持).后面上网找了下资料,发现大部分人都在用iscroll4(下面简称v4),下载下来试了下确 ...
- hdu4777 树状数组
题意:给了n个数,然后又m次查询,询问[L,R] 内有多少个数与其他的数不互质. 解: 我们首先可以通过处理得出每个数的有效区间,LR 就是 左边L位置上的数 和他不互质, 右边R位置上的数和不互质, ...
- Form数据迁移
--------------------------------------添加linkserver--------------------------------------- --EXEC mas ...
- mongodb认识
MongoDB安装 一.软件的获取地址 1.使用本安装文档提供的安装软件 本安装文档提供的软件为window版本的64位MongoDB的安装包 2.在官网上下载所需的安装软件 下载地址:https:/ ...
- js 比大小
html部分 <input type="button" onclick="mymax(5,4,12)" value="按钮"/> ...
- Python 缓存服务
缓存服务:mongodb.redis.memcache mongodb:早期的缓存系统,直接持久话,数据即存内存也同步到硬盘. redis:主流缓存系统,半持久化,默认存在内存,需要手动调用存在硬盘, ...
- auto关键字
使用前: #include<string> #include<vector> int main() { std::vector<std::string> vs; f ...
- Container的简单认识
容器是一个标准的软件单元,它将代码及其所有依赖关系打包,以便应用程序从一个计算环境快速可靠地运行到另一个计算环境. Docker容器映像是一个轻量级,独立的可执行软件包,包含运行应用程序所需的一切:代 ...
- TASE2017
PATTERN系列之五 I. Introduction To ease the expression of real-time requirements, Dwyer, and then Konrad ...
- (转载)UnityShader学习笔记(七) 让贴图纹理动起来(河流瀑布特效、精灵序列帧实现)
大家好,我是Zander.这一章我们将使用纹理贴图实现动画.混合和真实特效来达到理想的效果. 纹理贴图可以使我们的着色器快速的实现逼真的效果,但是如果添加的纹理贴图过多,会非常影响游戏性能,特别是在移 ...