luogu P3899 [湖南集训]谈笑风生 线段树合并
Description
Input
Output
输出 q 行,每行对应一个询问,代表询问的答案。
题解:对于第二种情况,直接用子树大小计算一下就行了.
对于第三种情况,用树上线段树合并,计算出每个点所维护的深度的线段树就行了.
至于怎么计算,用线段树合并即可.
#include<bits/stdc++.h>
#define maxn 300002
#define ll long long
using namespace std;
void setIO(string s)
{
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
freopen(out.c_str(),"w",stdout);
}
namespace tr
{
#define lson t[x].l
#define rson t[x].r
#define mid ((l+r)>>1)
int cnt;
int newnode(){ return ++cnt; }
struct Node
{
int l,r;
ll val, sumv;
}t[maxn*60];
void insert(int &x,int l,int r,int k,ll delta)
{
if(!x) x = newnode();
t[x].sumv += delta;
if(l==r) { t[x].val=delta; return; }
if(k <= mid) insert(lson, l, mid, k, delta);
else insert(rson, mid + 1, r, k, delta);
}
int merge(int u,int v)
{
if(!u||!v) return u + v;
int x = newnode();
t[x].sumv = t[u].sumv + t[v].sumv;
lson = merge(t[u].l,t[v].l);
rson = merge(t[u].r,t[v].r);
return x;
}
ll query(int x,int l,int r,int L,int R)
{
if(!x) return 0;
if(l>=L&&r<=R) return t[x].sumv;
ll tmp=0;
if(L<=mid) tmp+=query(lson,l,mid,L,R);
if(R>mid) tmp+=query(rson,mid+1,r,L,R);
return tmp;
}
};
int n,Q,edges;
int hd[maxn],to[maxn<<1],nex[maxn<<1],fa[maxn],siz[maxn],dep[maxn],rt[maxn];
void add(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void get(int u,int ff)
{
int i,v;
siz[u]=1, dep[u] = dep[ff] + 1;
for(i=hd[u];i;i=nex[i])
{
v=to[i];
if(v==ff) continue;
get(v,u), siz[u]+=siz[v];
}
}
void DFS(int u,int ff)
{
int i,v;
tr::insert(rt[u],0,n,dep[u],1ll*(siz[u]-1));
for(i=hd[u];i;i=nex[i])
{
v=to[i];
if(v==ff) continue;
DFS(v, u);
rt[u] = tr::merge(rt[v], rt[u]);
}
}
int main()
{
// setIO("input");
int i,j,x,y;
ll ans=0;
scanf("%d%d",&n,&Q);
for(i=1;i<n;++i)
{
scanf("%d%d",&x,&y);
add(x,y), add(y,x);
}
dep[0] = -1, get(1,0), DFS(1,0);
while(Q--)
{
scanf("%d%d",&x,&y);
ans = 0;
ans += 1ll*(siz[x]-1) * min(dep[x] , y);
ans += 1ll*tr::query(rt[x], 0, n, dep[x] + 1, dep[x] + y);
printf("%lld\n",ans);
}
return 0;
}
luogu P3899 [湖南集训]谈笑风生 线段树合并的更多相关文章
- 洛谷P3899 [湖南集训]谈笑风生(线段树合并)
题意 题目链接 Sol 线段树合并板子题,目前我看到两种写法,分别是这样的. 前一种每次需要新建一个节点,空间是\(O(4nlogn)\) 后者不需要新建,空间是\(O(nlogn)\)(面向数据算空 ...
- [Luogu P3899] [湖南集训]谈笑风生 (主席树)
题面 传送门:https://www.luogu.org/problemnew/show/P3899 Solution 你们搞的这道题啊,excited! 这题真的很有意思. 首先,我们可以先理解一下 ...
- 主席树 || 可持久化线段树 || 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 [湖南集训]谈笑风生 主席树
#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> ...
- P3899 [湖南集训]谈笑风生
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3653 https://www.luogu.org/problemnew/show/P38 ...
- 【Luogu】P3521ROT-Tree Rotations(线段树合并)
题目链接 神奇的线段树合并qwq 不过就思路而言很好想…… 观察到一棵树无论怎么交换两棵左右子树,子树内部的最优逆序对并没影响……决策只影响左右子树之间的逆序对…… 于是线段树合并直接乱搞就好啦 ...
- luogu P4775 [NOI2018]情报中心 线段树合并 虚树 树的直径trick
LINK:情报中心 神题! 写了一下午 写到肚子疼. 调了一晚上 调到ex 用的是网上dalao的方法 跑的挺快的. 对于链的暴力 我不太会kk. 直接说正解吧: 分类讨论两种情况: 1 答案的两条链 ...
- luogu P3180 [HAOI2016]地图 仙人掌 线段树合并 圆方树
LINK:地图 考虑如果是一棵树怎么做 权值可以离散 那么可以直接利用dsu on tree+树状数组解决. 当然 也可以使用莫队 不过前缀和比较难以维护 外面套个树状数组又带了个log 套分块然后就 ...
随机推荐
- cocos2dx 纹理优化
description: 为什么要谈纹理的问题,游戏的画面无时无刻不充斥着图像,通俗意义上一款精致的游戏都有着非常精美的画面.这样往往能给玩家带来更好的游戏体验,这一点也是对于游戏制作者来说所尽力追求 ...
- Java学习笔记----你可能不知道那些知识,对象复制与引用
1.private ,protected,static不能用来修饰interface. 2.java在处理基本数据类型(比如int ,char,double)时,都是採用按值传递的方式运行.除此之外的 ...
- unigui组件中client javascript delphi组件之间的操作
UniLabel组件: function OnClick(sender, e){ MainForm.UniLabel1.setText('Click!');} function Onmousemove ...
- android 7源码的下载【转】
本文转载自:http://www.jianshu.com/p/0799435daf8e android 7源码的下载 step: 1.ubuntu 环境 2.打开终端(快捷键:ctrl + alt + ...
- 【ZJOI2009】【Codevs 2347】假期的宿舍
http://codevs.cn/problem/2347/ Solution 二分图板子 连边:i认识j并且j是在校有床 i→j+n i有床i→i+n 还有就是找要在学校的人,1.有床不回2.没床的 ...
- 采用jq链(end方法和andSelf()方法)
end()方法: <style type="text/css"> .m1{background:#09C;} .m2{border:1px solid #000;} & ...
- 再谈 webpack build 及 加载优化
之前项目多,事情忙,一直没时间写博客,现在空闲下来了,总结一下 之前讲过了关于 build 压缩文件的方法,有兴趣的可以看下: 点击查看 现在讲讲一个页面的首屏加载速度该如何提升 提前说明 需要 we ...
- $CF19A\ World\ Football\ Cup$
炒鸡\(6\)批的模拟题. 注意的是输入 把握好空格 大小写. 根据题目的这句话来排序 积分榜是按照以下原则制作的:胜利一个队得3分,平分1分,失败0分. 首先,球队按积分顺序排在积分榜上,分数相等比 ...
- macbookpro安装Ubuntu16.04.1 LTS爬坑之旅。亲测有效(集众家之长)。安装时间为2017-11-19。
1.格式化U盘 要求:(1)切换分区格式为Mac OS扩展 (日志型):(2)方案(scheme)设置为:GUID Partition Map:如图(使用mac自带磁盘工具) 2.给Ubuntu划分磁 ...
- python自动化测试学习笔记-9测试框架
学习了这么久的python,我们已经可以自己搭建一个简单的测试和框架了,先从简单的开始,有时我们编写接口的测试用例会用excel进行编写,以下面的接口测试用例模板为例,进行编写: