Wannafly Camp 2020 Day 1E 树与路径 - 树上差分,LCA



#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
vector <int> g[N];
int f[N],dis[N],fa[N][20],vis[N],n,m,t1,t2,t3,t4,ps[N],pt[N],lc[N],ans;
int a[N],d[N];
void dfs1(int p) {
vis[p] = 1;
for (int i = 0; i < g[p].size(); i++)
if (!vis[g[p][i]])
fa[g[p][i]][0] = p,
dis[g[p][i]] = dis[p] + 1,
dfs1(g[p][i]);
}
int lca(int p, int q) {
if (dis[p] < dis[q]) swap(p, q);
for (int i = 18; i >= 0; --i)
if (dis[fa[p][i]] >= dis[q])
p = fa[p][i];
for (int i = 18; i >= 0; --i)
if (fa[p][i] - fa[q][i]) p = fa[p][i], q = fa[q][i];
if (p - q) p = fa[p][0], q = fa[q][0];
return p;
}
void dfs2(int p) {
vis[p] = 1;
for(int i=0;i<g[p].size();i++) {
int q=g[p][i];
if(vis[q]) continue;
dfs2(q);
a[p] += a[q] + d[q];
d[p] += d[q];
}
}
void dfs3(int p) {
vis[p]=1;
for(int i=0;i<g[p].size();i++) {
int q=g[p][i];
if(vis[q]) continue;
a[q] += a[p];
dfs3(q);
}
}
signed main() {
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<n;i++) {
cin>>t1>>t2;
g[t1].push_back(t2);
g[t2].push_back(t1);
}
dis[1]=1;
dfs1(1);
for (int j = 1; j <= 18; j++)
for (int i = 1; i <= n; i++)
fa[i][j] = fa[fa[i][j - 1]][j - 1];
for(int i=1;i<=m;i++) {
cin>>ps[i]>>pt[i];
lc[i]=lca(ps[i],pt[i]);
ans+=(dis[ps[i]]-dis[lc[i]])*(dis[pt[i]]-dis[lc[i]]);
int l = (dis[ps[i]]-dis[lc[i]])+(dis[pt[i]]-dis[lc[i]]);
int s = (dis[ps[i]]-dis[lc[i]]), u = ps[i];
a[u] += 1-l; d[u] += 2; a[lc[i]] -= 1-l+2*s; d[lc[i]] -= 2;
s = (dis[pt[i]]-dis[lc[i]]); u = pt[i];
a[u] += 1-l; d[u] += 2; a[lc[i]] -= 1-l+2*s; d[lc[i]] -= 2;
}
//for(int i=1;i<=n;i++) cout<<a[i]<<" "<<d[i]<<endl;
memset(vis,0,sizeof vis);
dfs2(1);
memset(vis,0,sizeof vis);
dfs3(1);
for(int i=1;i<=n;i++) cout<<ans-a[1]+a[i]<<endl;
}
Wannafly Camp 2020 Day 1E 树与路径 - 树上差分,LCA的更多相关文章
- BZOJ 3631 松鼠的新家 - 树链剖分 / 树上差分
传送门 分析: 树链剖分:x->y,将x到y的路径加一,并将x端点的答案-1,最后统计答案. 树上差分:x->y,x+1,y+1,lca-1,fa[lca]-1,并将x打上标记,最后统计前 ...
- 【BZOJ3307】雨天的尾巴 题解(树链剖分+树上差分)
题目链接 题目大意:给定一颗含有$n$个结点的树,每次选择两个结点$x$和$y$,对从$x$到$y$的路径上发放一带$z$类型的物品.问完成所有操作后每个结点发放最多的时哪种物品. 普通的树链剖分貌似 ...
- 【BZOJ-4326】运输计划 树链剖分 + 树上差分 + 二分
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 703 Solved: 461[Submit][Status] ...
- 有趣的线段树模板合集(线段树,最短/长路,单调栈,线段树合并,线段树分裂,树上差分,Tarjan-LCA,势能线段树,李超线段树)
线段树分裂 以某个键值为中点将线段树分裂成左右两部分,应该类似Treap的分裂吧(我菜不会Treap).一般应用于区间排序. 方法很简单,就是把分裂之后的两棵树的重复的\(\log\)个节点新建出来, ...
- P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并 (树上差分+线段树合并)
显然的树上差分问题,最后要我们求每个点数量最多的物品,考虑对每个点建议线段树,查询子树时将线段树合并可以得到答案. 用动态开点的方式建立线段树,注意离散化. 1 #include<bits/st ...
- Wannafly Camp 2020 Day 2F 采蘑菇的克拉莉丝 - 树链剖分
如果暴力维护,每次询问时需要对所有孩子做计算 考虑通过树剖来平衡修改与询问的时间,询问时计算重链和父树,轻链的贡献预先维护好,修改时则需要修改可能影响的轻链贡献,因为某个点到根的路径上轻重交替只有 \ ...
- Wannafly Camp 2020 Day 1D 生成树 - 矩阵树定理,高斯消元
给出两幅 \(n(\leq 400)\) 个点的无向图 \(G_1 ,G_2\),对于 \(G_1\) 的每一颗生成树,它的权值定义为有多少条边在 \(G_2\) 中出现.求 \(G_1\) 所有生成 ...
- Wannafly Camp 2020 Day 2E 阔力梯的树 - set,启发式合并
搞一波启发式合并即可 #include <bits/stdc++.h> using namespace std; #define int long long #define iter se ...
- Wannafly Camp 2020 Day 2I 堡堡的宝藏 - 费用流
感谢这道题告诉我KM求的是 完备 最大权匹配 :( #include <bits/stdc++.h> using namespace std; #define reset(x) memse ...
随机推荐
- 远程服务器返回错误:(414)Request-URI Too Large
近期因为疫情原因,一直是在家办公了,也导致了和同事对接接口上出现了很多小问题,这也从侧面反映出我个人对项目的设计不全面. 上面是对接接口时产生的一个问题:远程服务器返回错误:(414)Request- ...
- Git 工作流程和Git分支管理策略
git-flow 阮一峰大佬写的文章真不错 git-flow, github-flow, gitlab-flow 阮一峰大佬写的文章真不错
- linux中网络命令
write 解释 命令名称:write 命令所在路径:/usr/bin/write 执行权限:所有用户 功能描述:给用户发信息,以Ctrl+D保存结束 语法 write <用户名> 示例 ...
- Github上优秀的.NET Core项目
Github上优秀的.NET Core开源项目的集合.内容包括:库.工具.框架.模板引擎.身份认证.数据库.ORM框架.图片处理.文本处理.机器学习.日志.代码分析.教程等. Github地址:htt ...
- JS的基本概念和数据类型
什么是 JavaScript 语言 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ ta ...
- ES6中Set和WeakSet
Set(放数组,不能重复) 会自动去重,有4个元素,但是打印出来只有三个 let setArr=new Set(['zhang','huan','eternity','zhang']); consol ...
- ggEditor流程图增加网格背景
参考官方文档: https://www.yuque.com/antv/g6/plugin.tool.grid react-ggEditor如何使用 import { Flow } from 'gg-e ...
- 浏览器对象模型“BOM”,对浏览器窗口进行访问和操作
location对象 location.href url地址 location.hash 锚点 location.hostname 主机名(需要放到服务器上) location.ho ...
- Qt实践-基于C++的UI设计基础
学习网址:http://c.biancheng.net/view/1824.html 我的代码: 头文件qwdlgmanual.h: #ifndef QWDLGMANUAL_H #define QWD ...
- [51nod 1126] 求递推序列的第N项 - 矩阵乘法
#include <bits/stdc++.h> using namespace std; #define int long long const int mod = 7; struct ...