简化题意

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 [谈笑风生]的更多相关文章

  1. 【洛谷P3899】谈笑风生

    题目大意:给定一棵 N 个节点的有根树,1 号节点为根节点,现给出 Q 个询问,每次询问距离 u 号节点不超过 K 的节点 b,c 为 a 与 b 的后代,求这样的三元组有多少个. 题解:学会了线段树 ...

  2. 洛谷P3899 [湖南集训]谈笑风生(线段树合并)

    题意 题目链接 Sol 线段树合并板子题,目前我看到两种写法,分别是这样的. 前一种每次需要新建一个节点,空间是\(O(4nlogn)\) 后者不需要新建,空间是\(O(nlogn)\)(面向数据算空 ...

  3. 【洛谷 P3899】 [湖南集训]谈笑风生 (主席树)

    题目链接 容易发现\(a,b,c\)肯定是在一条直链上的. 定义\(size(u)\)表示以\(u\)为根的子树大小(不包括\(u\)) 分两种情况, 1.\(b\)是\(a\)的祖先,对答案的贡献是 ...

  4. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  5. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  6. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  7. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  8. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  9. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

随机推荐

  1. WAR包方式安装Jenkins

    WAR包方式安装Jenkins     系统环境: CentOS 7.5 1804 IP:192.168.1.3 关闭selinux.firewalld jenkins war包:下载地址 一.安装t ...

  2. C++对象赋值问题

  3. Fluxion无线攻击

    使用步骤 github地址 https://github.com/deltaxflux/fluxion 进入到fluxion目录下 ./fluxion 启动fluxion  启动之后会先检测没有安装的 ...

  4. CSS组合选择符

    组合选择符说明了两个选择器直接的关系. 目录: 后代选取器(以空格分隔) 子元素选择器(以大于号分隔) 相邻兄弟选择器(以加号分隔) 普通兄弟选择器(以破折号分隔) 后代选取器 后代选取器匹配所有值得 ...

  5. Ubuntu16.04 appstreamcli错误

    解决方案:https://askubuntu.com/questions/774986/appstreamcli-hanging-with-100-cpu-usage-during-update 搬运 ...

  6. Node + Redis 实现分布式Session方案(转载)

    Session是什么? Session 是面向连接的状态信息,是对 Http 无状态协议的补充. Session 怎么工作? Session 数据保留在服务端,而为了标识具体 Session 信息指向 ...

  7. 使用shiro框架,注销问题的解决

    在使用shiro框架的时候,有时候会因为登录问题找不到注销的controller.所以会报404的错误,下面是解决办法: 1.首先写一个类SystemLogoutFilter继承LogoutFilte ...

  8. jupyter notebook新用法

    输入单词以后按下tab键以后 出现提示 a是个矩阵或者数组,a.flatten()就是把a降到一维,默认是按横的方向降>>> a = np.array([[1,2], [3,4]]) ...

  9. 【shell】wc命令

    wc是一个非常方便的文本处理命令,有两个功能: 统计文件的行数 统计文件的字符数 那么就有三个参数: -l :只统计行数 -w: 统计英文单词数 -m: 统计字符数 default :行数+单词数 默 ...

  10. EDK II之Device Path

    UEFI中通过Device Path来描述设备的路径,一个完整的路径由多个Device Path Nodes组成. 下面通过输入设备的路径作为例子: PNP0A03 – PCI Host Bridge ...