题目链接

容易发现\(a,b,c\)肯定是在一条直链上的。

定义\(size(u)\)表示以\(u\)为根的子树大小(不包括\(u\))

分两种情况,

1、\(b\)是\(a\)的祖先,对答案的贡献是

\[min(deep(p)-1,k)*size(p)
\]

显然是可以直接算的。

2、\(b\)是\(a\)的孩子,对答案的贡献为

\[\sum_{\text{v是u的孩子且deep(v)<=deep(u)+k}}size[v]
\]

后半段就可以主席树来维护了。

下标为深度,值为\(\sum size\),因为同一子树内\(dfs\)序是连续的,就像树剖那样用主席树维护就好了。

(为什么我总是不记得开\(long long\)?)

#include <cstdio>
typedef long long ll;
int s; char ch;
inline int read(){
s = 0; ch = getchar();
while(ch < '0' || ch > '9') ch = getchar();
while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); }
return s;
}
inline void Chkmax(int &a, int b){
if(b > a) a = b;
}
inline int min(int a, int b){
return a > b ? b : a;
}
const int MAXN = 300010;
const int MAXMLOGN = 60000010;
int num, maxdeep, cnt, ID, n, m, a, b;
int head[MAXN], deep[MAXN], dfn[MAXN], pos[MAXN], root[MAXN], size[MAXN]; struct Tree{
ll val;
int lc, rc;
}t[MAXMLOGN];
inline void pushup(int now){
t[now].val = t[t[now].lc].val + t[t[now].rc].val;
}
int build(int l, int r){
int id = ++cnt;
if(l == r) return id;
int mid = (l + r) >> 1;
t[id].lc = build(l, mid);
t[id].rc = build(mid + 1, r);
return id;
}
int insert(int now, int l, int r, int x, int y){
int id = ++cnt; t[id] = t[now];
if(l == r){ t[id].val += y; return id; }
int mid = (l + r) >> 1;
if(x <= mid) t[id].lc = insert(t[now].lc, l, mid, x, y);
else t[id].rc = insert(t[now].rc, mid + 1, r, x, y);
pushup(id);
return id;
}
ll query(int p, int q, int l, int r, int wl, int wr){
if(r < wl || l > wr) return 0;
if(l >= wl && r <= wr) return t[q].val - t[p].val;
int mid = (l + r) >> 1; ll ans = 0;
ans += query(t[p].lc, t[q].lc, l, mid, wl, wr);
ans += query(t[p].rc, t[q].rc, mid + 1, r, wl, wr);
return ans;
}
struct Edge{
int next, to;
}e[MAXN << 1];
inline void Add(int from, int to){
e[++num].to = to; e[num].next = head[from]; head[from] = num;
e[++num].to = from; e[num].next = head[to]; head[to] = num;
}
int dfs(int u, int fa){
Chkmax(maxdeep, deep[u] = deep[fa] + 1);
dfn[u] = ++ID;
for(int i = head[u]; i; i = e[i].next)
if(e[i].to != fa)
size[u] += dfs(e[i].to, u);
return size[u] + 1;
}
int main(){
n = read(); m = read();
for(int i = 1; i < n; ++i)
Add(read(), read());
dfs(1, 0);
for(int i = 1; i <= n; ++i)
pos[dfn[i]] = i;
root[0] = build(1, maxdeep);
for(int i = 1; i <= n; ++i)
root[i] = insert(root[i - 1], 1, maxdeep, deep[pos[i]], size[pos[i]]);
for(int i = 1; i <= m; ++i){
a = read(); b = read();
printf("%lld\n", (ll)min(deep[a] - 1, b) * size[a] + query(root[dfn[a] - 1], root[dfn[a] + size[a]], 1, maxdeep, deep[a] + 1, deep[a] + b));
}
return 0;
}

【洛谷 P3899】 [湖南集训]谈笑风生 (主席树)的更多相关文章

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

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

  2. [Luogu P3899] [湖南集训]谈笑风生 (主席树)

    题面 传送门:https://www.luogu.org/problemnew/show/P3899 Solution 你们搞的这道题啊,excited! 这题真的很有意思. 首先,我们可以先理解一下 ...

  3. P3899 [湖南集训]谈笑风生 主席树

    #include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> ...

  4. luogu P3899 [湖南集训]谈笑风生 线段树合并

    Code: #include<bits/stdc++.h> #define maxn 300002 #define ll long long using namespace std; vo ...

  5. 主席树 || 可持久化线段树 || BZOJ 3653: 谈笑风生 || Luogu P3899 [湖南集训]谈笑风生

    题面:P3899 [湖南集训]谈笑风生 题解: 我很喜欢这道题. 因为A是给定的,所以实质是求二元组的个数.我们以A(即给定的P)作为基点寻找答案,那么情况分两类.一种是B为A的父亲,另一种是A为B的 ...

  6. 洛谷P2617 Dynamic Ranking(主席树,树套树,树状数组)

    洛谷题目传送门 YCB巨佬对此题有详细的讲解.%YCB%请点这里 思路分析 不能套用静态主席树的方法了.因为的\(N\)个线段树相互纠缠,一旦改了一个点,整个主席树统统都要改一遍...... 话说我真 ...

  7. 洛谷P4587 神秘数 [FJOI2016] 主席树

    正解:主席树 解题报告: 先放下传送门QAQ 首先可以先思考如果只有一组询问,怎么解决 可以这么想,最开始一个数也麻油的时候能表示的最大的数是0嘛 然后先排个序,按顺序每次新加入一个数x,设加入这个数 ...

  8. 2018.09.14 洛谷P3567 [POI2014]KUR-Couriers(主席树)

    传送门 简单主席树啊. 但听说有随机算法可以秒掉%%%(本蒟蒻并不会) 直接维护值域内所有数的出现次数之和. 当这个值不大于区间总长度的一半时显然不存在合法的数. 这样在主席树上二分查值就行了. 代码 ...

  9. 2018.07.07 洛谷 P3939 数颜色(主席树)

    P3939 数颜色 题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不 ...

  10. 洛谷P3168 [CQOI2015]任务查询系统 [主席树,差分]

    题目传送门 任务查询系统 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任 ...

随机推荐

  1. iOS- 用UICollectionViewController 来进行横竖屏九宫格布局

    1.简单说说UICollectionViewController 我们在做九宫格布局时,可以使用UIScrollView,也可以使用UICollectionViewController. 当我们用UI ...

  2. TCP系列03—连接管理—2、TCP连接的同时打开和同时关闭

    在前面的内容中我们介绍了TCP连接管理中最常见的三次握手方式和四次挥手的方式.但是有可能A和B两端同时执行主动打开并连接对方或者同时执行主动关闭连接(尽管发生这种情况的可能性比较低低),这个时候的流程 ...

  3. css那些事儿2 盒子模型

    盒子模型是网页元素所占据页面窗口的矩形范围,是网页布局的核心基础之一,这里的盒子模型与我们平常收到的包裹类似. 一个包裹从内到外,分为真实物品部分,物品与外壳之间的填充区,外壳的厚度,当多个包裹放置在 ...

  4. SonarQube安装

    要求 至少1G以上内存,推荐为2G Java:Oracle JRE 7u75+,OpenJDK 7u75+ 数据库: Microsoft SQL Server 2008/2012/2014 MySQL ...

  5. Oracle中预定义角色有哪些?

    1. CONNECT 2. RESOURCE 3. DBA 4. EXP_FULL_DATABASE 5. IMP_FULL_DATABASE 6. DELETE_CATALOG_ROLE 7. EX ...

  6. Java 多线程序的一点理解

    synchronized 是java 内主要的同步标记 1 同步非静态方法 作用域范围只是当前对象在不同线程间的同步, 如果n 为Test外的对象,在不同的Test对象之间,等于没有同步, 该方法只能 ...

  7. HUAS 1483 mex(莫队算法)

    考虑莫队算法,对于区间减小的情况,可以O(1)解决.对于区间增加的情况,可能需要O(n)解决.好在数据不卡莫队. 1200ms过了. 离线+线段树 760ms过了. # include <cst ...

  8. RESTful Webservice

    1,REST和RESTFUL是什么? REST ( REpresentational State Transfer ),State Transfer 为 "状态传输" 或 &quo ...

  9. 【刷题】BZOJ 1143 [CTSC2008]祭祀river

    Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成 ...

  10. python安装方法- 3.6.3版本

    一. 官网下载安装包: 官网网址:https://www.python.org/ 我下载的是3.6.3版本,如下图:  二. 安装安装包, 1. 直接双击运行  2. 选择Customize inst ...