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 ...
随机推荐
- HA: Chanakya Vulnhub Walkthrough
靶机链接: https://www.vulnhub.com/entry/ha-chanakya,395/ 网络主机探测: 主机端口扫描: nmap -p- -sC -sV 10.10.202.136 ...
- asp.net abp模块化开发之通用树2:设计思路及源码解析
一.前言 上一篇大概说了下abp通用树形模块如何使用,本篇主要分析下设计思路. 日常开发中会用到很多树状结构的数据,比如:产品的多级分类.省市区县,大多数系统也会用到类似“通用字典/数据字典”的功能, ...
- SVN仓库备份和迁移
SVN仓库备份和迁移 author: yunqimg(ccxtcxx0) 前言 本文主要是讲 SVN 仓库的全量备份和增量备份,只包括基本操作. 如有疑问请参考 References. 仓库备份 sv ...
- Expert C Programming(C专家编程) 读书笔记
目录 几个比较奇葩的指针赋值 int (* fun())() int (* foo())[] int (*foo[])() const 关键词的意义是什么? char const (*next )() ...
- cf912D
题意简述:往n*m的网格中放k条鱼,一个网格最多放一条鱼,然后用一个r*r的网随机去捞鱼,问怎么怎么放鱼能使得捞鱼的期望最大,输出这个期望 题解:肯定优先往中间放,这里k不大,因此有别的简单方法,否则 ...
- 用Excel排值班表用到的几个公式
用Excel排值班表用到的几个公式 最近,疫情得到了一定的缓解,但还不能放松.所以,各单位都加强值班.那就得排值班表.提到的表当然要用Excel,为什么?因为Excel中的公式真得能让我们提高工作效率 ...
- android中常用的布局管理器(二)
接上篇博客 (3)LinearLayout 线性布局管理器 线性布局管理器是将放入其中的组件按照垂直或水平方向来布局,每一行或每一列只能放一个组件,并且不会换行,当组件排列到窗体的边缘后,后面 ...
- Wannafly Winter Camp 2020 Day 7E 上升下降子序列 - 数学
神奇公式 #include <bits/stdc++.h> using namespace std; #define int long long int n,mod,c[205][205] ...
- 有意思的GitHub项目
1.强大而又优雅的运维一键自动化管理工具,朋友公司在做,大牛支持,墙裂推荐 官方网站:http://www.bigops.com/ 2.用 PHP 写一个命令行音乐搜索下载器,支持 QQ.网易.酷狗. ...
- go 总结常用函数
golang截取字符串 对于字符串操作,截取字符串是一个常用的, 而当你需要截取字符串中的一部分时,可以使用像截取数组某部分那样来操作,示例代码如下: package main import &quo ...