3653: 谈笑风生
3653: 谈笑风生
链接
分析:
$ans = min(deep[x] - 1, k) * siz[x] - 1 +\sum\limits_{y是u子树内的点}(siz[y] - 1)$
前面的可以$O(1)$算,后面的那一部分可以dfs序+主席树维护。
或者dfs的过程中+线段树合并。或者长链剖分。
代码:
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<cmath> #include<cctype> #include<set> #include<queue> #include<vector> #include<map> using namespace std; typedef long long LL;inline int read() {int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f; }const int N = 600005; struct Edge{ int to, nxt; } e[N << 1]; int head[N], deep[N], fa[N], siz[N], st[N], ed[N], tr[N], En, Index, TimeIndex; int ls[N * 20], rs[N * 20], Root[N]; LL sum[N * 20];inline void add_edge(int u,int v) {++En; e[En].to = v, e[En].nxt = head[u]; head[u] = En;++En; e[En].to = u, e[En].nxt = head[v]; head[v] = En; } void dfs(int u) {deep[u] = deep[fa[u]] + 1;siz[u] = 1;st[u] = ++TimeIndex;tr[TimeIndex] = u;for (int i = head[u]; i; i = e[i].nxt) {int v = e[i].to;if (v == fa[u]) continue;fa[v] = u;dfs(v);siz[u] += siz[v];}ed[u] = TimeIndex; } void update(int l,int r,int last,int &now,int p) {if (!now) now = ++Index;sum[now] += sum[last] + siz[tr[p]] - 1; /// !!!if (l == r) return ;int mid = (l + r) >> 1;if (deep[tr[p]] <= mid) {rs[now] = rs[last];update(l, mid, ls[last], ls[now], p);} else {ls[now] = ls[last];update(mid + 1, r, rs[last], rs[now], p);} } LL query(int l,int r,int last,int now,int L,int R) {if (L <= l && r <= R) return sum[now] - sum[last];int mid = (l + r) >> 1; LL res = 0;if (L <= mid) res = query(l, mid, ls[last], ls[now], L, R);if (R > mid) res += query(mid + 1, r, rs[last], rs[now], L, R);return res; } int main() {int n = read(), Q = read(), D;for (int i = 1; i < n; ++i) {int u = read(), v = read();add_edge(u, v);}dfs(1);for (int i = 1; i <= n; ++i) D = max(D, deep[i]);for (int i = 1; i <= n; ++i) {update(1, D, Root[i - 1], Root[i], i);}LL ans = 0;while (Q--) {int x = read(), k = read();ans = 1ll * min(deep[x] - 1, k) * (siz[x] - 1);if (deep[x] < D) ans += query(1, D, Root[st[x]], Root[ed[x]], deep[x] + 1, min(D, deep[x] + k));printf("%lld\n", ans);}return 0; }
转载于:https://www.cnblogs.com/mjtcn/p/10288346.html
3653: 谈笑风生相关推荐
- [BZOJ 3653]谈笑风生
[BZOJ 3653] 谈笑风生 题意 给定一棵 \(n\) 个点根为 \(1\) 单位权值的树以及 \(q\) 个查询, 每次查询给定 \(p\) 和 \(k\), 求满足 \(a,p\) 都是 \ ...
- BZOJ 3653: 谈笑风生(离线, 长链剖分, 后缀和)
题意 给你一颗有 \(n\) 个点并且以 \(1\) 为根的树.共有 \(q\) 次询问,每次询问两个参数 \(p, k\) .询问有多少对点 \((p, a, b)\) 满足 \(p,a,b\) 为 ...
- 【刷题】BZOJ 3653 谈笑风生
Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称"a比b不知道 高明到哪里去了". ? 设a 和 b 为 ...
- [BZOJ 3653] 谈笑风生
题目 给定一棵 n 个点的有根树,另有 q 次询问,每次询问给定 a.k,求有多少个点对 (b, c) 满足 a.b.c 两两不同,a.b 都是 c 的祖先且 a.b 间距离不超过 k. n, q ≤ ...
- BZOJ 3653 谈笑风生
Problem BZOJ 然而是权限题,如果你像蒟蒻我一样没有权限号请上洛谷~ Solution 据说正解是主席树??? 不管了,反正主席树常数巨大,线段树虽然暴力好歹也能卡过去,而且这题数据还比较水 ...
- BZOJ 3653: 谈笑风生
题目在这里呀! 个人认为是一道很好的题目,原来可持久化线段树还能这么用,看题解之前还是没有想到啦要批评!那就写个题解补偿一下? 题意 给你一棵有根树,n个节点,有q次询问,每次询问,给出两个数x(1& ...
- BZOJ #3653. 谈笑风生
题目 题意: 给定一棵树. 询问给定b,kb,kb,k,现在要选择两个距离b≤kb\le kb≤k单位的点a,ca,ca,c,使得a,ba,ba,b都是ccc的祖先. 问总选择方案数. n,q≤3e5 ...
- 做题记录 To 2019.2.13
2019-01-18 4543: [POI2014]Hotel加强版:长链剖分+树形dp. 3653: 谈笑风生:dfs序+主席树. POJ 3678 Katu Puzzle:2-sat问题,给n个变 ...
- bzoj 3653 [湖南集训]谈笑风生
题目描述 设 T 为一棵有根树,我们做如下的定义: • 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称"a 比 b 不知道高明到哪里去了". • 设 a ...
最新文章
- python的flask实现接口_使用python的Flask实现一个接口mock数据(傻瓜教程)
- 性能测试应用领域分析
- 来自顶尖JAVA程序猿的焦虑,拒绝中年危机,唯有一生力学笃行
- pandas 读取写入保存文件
- 数据结构第八篇——链栈
- AI:一张高清长图教你读懂AI简史《1308年 → 至今》
- WIN7系统激活后无法正常启动
- C++ 指针函数和函数指针
- 使用日志审计查看MaxCompute执行过哪些操作
- 【Hadoop Summit Tokyo 2016】云上的大象
- java 浅堆 深堆_JVM中的一个小知识点:深堆和浅堆的概念
- 58同城笔试题:数组去重;分饼干(分糖果);最小路径和(leetcode64)
- PyTorch学习—18.标准化—Batch Normalization、Layer Normalizatoin、Instance Normalizatoin、Group Normalizatoin
- FISCO BCOS Solidity 智能合约 返回json对象、字典mapping、结构体
- MacBook上Wi-Fi抓包权限
- matlab画收敛曲线,3.26 面收敛处理
- 资源吧网站模板下载织梦cms精仿资源吧网站模板
- 电路课组(一)电路原理 Review 1 线性电路分析基础
- java pdf 修改内容_生成PDF全攻略之在已有PDF上添加内容的实现方法
- 来说说wow魔兽地形