洛谷 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 不够 没有取 ...
随机推荐
- usermod - linux修改用户帐户信息
usermod - 修改用户帐户信息 modify a user account usermod [options] user_name usermod 命令修改系统帐户文件来反映通过命令行指定的变化 ...
- linux C access
[1]作用 确定文件的访问权限 [2]头文件 #include <unistd.h> [3]函数定义 int access(const char * pathname, int mode ...
- FangDD Java编程规范
我们采用<Oracle/Sun原生的Java编程规范>和<Google Java编程规范> Google Java编程风格指南 January 20, 2014 作者:Haws ...
- python基础(四)集合
[集合特点] 1.天生去重.循环 2 关系测试 -交集,差集,并集,(反向差集,对称差集) list = [1,2,3,4,5,3,6]list_2 =[2,3,5,7,8]list=set(lis ...
- 4. Dubbo原理解析-代理之接口定义 (转)
转载自 斩秋的专栏 http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159 一:ProxyFactory的接口定义 impo ...
- Linux——入门命令
授课内容: 0.linux系统由来 linux各种常用命令以及对命令参数选项的熟悉: 1.目录操作命令([跳转:查看自己当下的位置-绝对路径:查看任何路径下的目录内容]pwd(Print Workin ...
- 【六】jquery之HTML代码/文本/值[下拉列表框、多选框、单选框的选中]
val()方法不仅能设置元素的值,同时也能获取元素的值.另外,val()方法还有另外一个用处,就是它能使select(下拉列表框).checkbox(多选框)和radio(单选框)相应的选项被选中,在 ...
- Linux ssh下实现免密码登录
1.Linux 生成密钥 ssh-keygen -t rsa 进入“.ssh”会生成以下几个文件 id_rsa : 生成的私钥文件 id_rsa.pub : 生成的公钥文件 know_hosts : ...
- leecode第二百一十五题(数组中的第K个最大元素)
class Solution { public: int quick_sort_version(vector<int>& nums, int k,int begin,int end ...
- npm 是干什么的
网上的 npm 教程主要都在讲怎么安装.配置和使用 npm,却不告诉新人「为什么要使用 npm」.今天我就来讲讲这个话题. 本文目标读者是「不太了解 npm 的新人」,大神您别看了,不然又说我啰嗦了 ...