#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的更多相关文章

  1. BZOJ 3631 松鼠的新家 - 树链剖分 / 树上差分

    传送门 分析: 树链剖分:x->y,将x到y的路径加一,并将x端点的答案-1,最后统计答案. 树上差分:x->y,x+1,y+1,lca-1,fa[lca]-1,并将x打上标记,最后统计前 ...

  2. 【BZOJ3307】雨天的尾巴 题解(树链剖分+树上差分)

    题目链接 题目大意:给定一颗含有$n$个结点的树,每次选择两个结点$x$和$y$,对从$x$到$y$的路径上发放一带$z$类型的物品.问完成所有操作后每个结点发放最多的时哪种物品. 普通的树链剖分貌似 ...

  3. 【BZOJ-4326】运输计划 树链剖分 + 树上差分 + 二分

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 703  Solved: 461[Submit][Status] ...

  4. 有趣的线段树模板合集(线段树,最短/长路,单调栈,线段树合并,线段树分裂,树上差分,Tarjan-LCA,势能线段树,李超线段树)

    线段树分裂 以某个键值为中点将线段树分裂成左右两部分,应该类似Treap的分裂吧(我菜不会Treap).一般应用于区间排序. 方法很简单,就是把分裂之后的两棵树的重复的\(\log\)个节点新建出来, ...

  5. P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并 (树上差分+线段树合并)

    显然的树上差分问题,最后要我们求每个点数量最多的物品,考虑对每个点建议线段树,查询子树时将线段树合并可以得到答案. 用动态开点的方式建立线段树,注意离散化. 1 #include<bits/st ...

  6. Wannafly Camp 2020 Day 2F 采蘑菇的克拉莉丝 - 树链剖分

    如果暴力维护,每次询问时需要对所有孩子做计算 考虑通过树剖来平衡修改与询问的时间,询问时计算重链和父树,轻链的贡献预先维护好,修改时则需要修改可能影响的轻链贡献,因为某个点到根的路径上轻重交替只有 \ ...

  7. Wannafly Camp 2020 Day 1D 生成树 - 矩阵树定理,高斯消元

    给出两幅 \(n(\leq 400)\) 个点的无向图 \(G_1 ,G_2\),对于 \(G_1\) 的每一颗生成树,它的权值定义为有多少条边在 \(G_2\) 中出现.求 \(G_1\) 所有生成 ...

  8. Wannafly Camp 2020 Day 2E 阔力梯的树 - set,启发式合并

    搞一波启发式合并即可 #include <bits/stdc++.h> using namespace std; #define int long long #define iter se ...

  9. Wannafly Camp 2020 Day 2I 堡堡的宝藏 - 费用流

    感谢这道题告诉我KM求的是 完备 最大权匹配 :( #include <bits/stdc++.h> using namespace std; #define reset(x) memse ...

随机推荐

  1. docker配置仓库源

    1 修改docker配置文件 下面的内网ip改成公司的私有仓库地址 后面两个建议保留(一个是国内加速源,一个是国外仓库.这两个删了也是可以的) 2 重启docker服务 # vim /etc/dock ...

  2. SpringBoot整合NoSql--(四)Session共享

    简介: 正常情况下,HttpSession是通过Servlet 容器创建并进行管理的,创建成功之后都是保存在内存中.如果开发者需要对项目进行横向扩展搭建集群,那么可以利用一些硬件或者软件工具来做负载均 ...

  3. MySQL Execute Plan--Index Merge特性

    Index Merge特性 在MySQL 5.5之前版本中,查询或子查询被限制在一个表只能使用一个索引(回表查询除外). 假设表TB1001上C1和C2列分别有单列索引,如对下面查询: SELECT ...

  4. Page Object设计模式(一)

    一.简介 主要特点体现在“对界面交互细节的封装”上,使测试用例更专注于业务的操作,从而提高测试用例的可维护性.解决UI变动问题. page对象的一个基本原则经验法则是:凡是人能做的事,page对象通过 ...

  5. css基础-定位+网页布局案例

    position:static 忽略top/bottom/left/right或者z-index position:relative 设置相对定位的元素不会脱离文档流 position:fixed 不 ...

  6. Neo4j入门-开始使用

    前言 关系,指事物之间相互作用.相互影响的状态. 数据之间的关系也是如此,数据之间关系的存储在RDS就已经开始.从数据库支持的外键,到手动建立的关系表,人们采取了许多方法,只为了解决查询复杂.缓慢等问 ...

  7. Mysql基础04-查询

    关联查询 1.内连接:实现A∩B select 字段列表 from A表 inner join B表 on 关联条件 where 等其他子句; 2.左外连接 #实现查询结果是A select 字段列表 ...

  8. maven的核心概念——坐标

    7.1 几何中的坐标 [1]在一个平面中使用x.y两个向量可以唯一的确定平面中的一个点. [2]在空间中使用x.y.z三个向量可以唯一的确定空间中的一个点. 7.2 Maven的坐标 使用如下三个向量 ...

  9. npm常用模块之bable使用

    更多npm常用模块使用请访问:npm常用模块汇总 bable这是JavaScript编译器. Babel是一个工具链,主要用于在当前和较旧的浏览器或环境中将ECMAScript 2015+代码转换为J ...

  10. hdu 1011 Starship Troopers(树上背包)

    Problem Description You, the leader of Starship Troopers, are sent to destroy a base of the bugs. Th ...