F - Colorful Tree

给定一棵树,边有边权,且每条边有一个颜色,有mmm次操作,

每次给定x,y,u,vx, y, u, vx,y,u,v,如果把颜色为xxx的边,边权修改为yyy,求u,vu, vu,v两点的距离,考虑

设111号节点为根节点,

设d[i]d[i]d[i]为111到iii的距离,dis(u,v)=d[u]+d[v]−2×d[lca]dis(u, v) = d[u] + d[v] - 2 \times d[lca]dis(u,v)=d[u]+d[v]−2×d[lca],

设num[i][x]num[i][x]num[i][x]为111到iii,颜色为xxx的数量,sum[i][x]sum[i][x]sum[i][x]为111到iii,颜色为xxx的边权和,

则d′[u]=d[u]−sum[u][x]+num[u][x]×yd'[u] = d[u] - sum[u][x] + num[u][x] \times yd′[u]=d[u]−sum[u][x]+num[u][x]×y,dis′(u,v)=d′[u]+d′[v]−2×d′[lca]dis'(u, v) = d'[u] + d'[v] -2 \times d'[lca]dis′(u,v)=d′[u]+d′[v]−2×d′[lca],离线处理一下即可。

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int head[N], to[N << 1], nex[N << 1], col[N << 1], val[N << 1], cnt = 1;int son[N], sz[N], fa[N], id[N], rk[N], top[N], dep[N], tot;int n, m, num[N];long long ans[N], sum[N], dis[N];struct Res {int x, y, add, id;
};vector<Res> a[N];void add(int x, int y, int c, int d) {to[cnt] = y;nex[cnt] = head[x];col[cnt] = c;val[cnt] = d;head[x] = cnt++;
}void dfs1(int rt, int f) {fa[rt] = f, dep[rt] = dep[f] + 1, sz[rt] = 1;for (int i = head[rt]; i; i = nex[i]) {if (to[i] == f) {continue;}dis[to[i]] = dis[rt] + val[i];dfs1(to[i], rt);sz[rt] += sz[to[i]];if (!son[rt] || sz[son[rt]] < sz[to[i]]) {son[rt] = to[i];}}
}void dfs2(int rt, int tp) {top[rt] = tp, rk[++tot] = rt, id[rt] = tot;if (!son[rt]) {return ;}dfs2(son[rt], tp);for (int i = head[rt]; i; i = nex[i]) {if (to[i] == son[rt] || to[i] == fa[rt]) {continue;}dfs2(to[i], to[i]);}
}int lca(int x, int y) {while (top[x] != top[y]) {if (dep[top[x]] < dep[top[y]]) {swap(x, y);}x = fa[top[x]];}return dep[x] < dep[y] ? x : y;
}void dfs(int rt, int fa) {for (auto &it : a[rt]) {ans[it.id] += 1ll * it.add * (dis[rt] - sum[it.x] + 1ll * num[it.x] * it.y);}for (int i = head[rt]; i; i = nex[i]) {if (to[i] == fa) {continue;}num[col[i]]++;sum[col[i]] += val[i];dfs(to[i], rt);num[col[i]]--;sum[col[i]] -= val[i];}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d %d", &n, &m);for (int i = 1, x, y, c, d; i < n; i++) {scanf("%d %d %d %d", &x, &y, &c, &d);add(x, y, c, d);add(y, x, c, d);}dfs1(1, 0);dfs2(1, 1);for (int i = 1, x, y, u, v; i <= m; i++) {scanf("%d %d %d %d", &x, &y, &u, &v);int f = lca(u, v);a[u].push_back({x, y, 1, i});a[v].push_back({x, y, 1, i});a[f].push_back({x, y, -2, i});}dfs(1, 0);for (int i = 1; i <= m; i++) {printf("%lld\n", ans[i]);}return 0;
}

F - Colorful Tree(LCA,树上差分,离线处理)相关推荐

  1. 洛谷P2680 运输计划(倍增LCA + 树上差分 + 二分答案)

    [题目链接] [思路]: 根据题意可以明显看出,当所有任务都完成时的时间是最终的结果,也就是说本题要求,求出最小的最大值. 那这样的话就暗示了将答案二分,进行check. [check方法]: 如果说 ...

  2. 【HDU - 5452】Minimum Cut(树形dp 或 最近公共祖先lca+树上差分,转化tricks,思维)

    题干: Given a simple unweighted graph GG (an undirected graph containing no loops nor multiple edges) ...

  3. HDU - 5452 Minimum Cut(LCA+树上差分)

    题目链接:点击查看 题目大意:给出n个点,n-1条边组成一棵树,然后再给出m-n-1条边,组成一个图,现在要让我们求最少删去几条边才能让整个图不连通,并且要求只能在树上删去最多一条边 题目分析:这个题 ...

  4. P2680-运输计划【LCA,树上差分,二分答案】

    正题 题目链接:https://www.luogu.org/problemnew/show/P2680 题目大意 一棵带权无根树,给出若干条路径.选择一条边使其边权变为0,要求路径的长度的最大值最小. ...

  5. [luogu P3128][USACO15DEC]Max Flow [LCA][树上差分]

    题目描述 Farmer John has installed a new system of  pipes to transport milk between the  stalls in his b ...

  6. [JLOI2014]松鼠的新家 倍增LCA+树上差分

    题目描述 题目 本来想写一道Tarjan的,结果发现这题倍增比较好写 这题主要要搞懂树上差分这东西(NOIP前这东西卡了我好久) 大概要注意的就是对于除了出发点以外的所有点都是重复算了的,所以最后要有 ...

  7. 松鼠的新家 LCA + 树上差分

    题意 中文题意就不需要分析了吧 分析 首先两点之间,我们应该去走最短路径最能得到最优解,所以很容易想到求LCA,假设两点分别为x,y,LCA(x,y) = u,所以只需要把路径 x -> u - ...

  8. P3258[JLOI2014]松鼠的新家(LCA 树上差分)

    P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  9. codeforces1467 E. Distinctive Roots in a Tree(树上差分)

    E. Distinctive Roots in a Tree 树上差分 如果当前节点u的某一棵子树中的某个节点的值和当前节点相同,那么除了当前节点这一棵子树节点,其他节点(其他子树以及u上面的节点)一 ...

最新文章

  1. Python字符串常用方法(二)
  2. Java定时任务调度工具
  3. YUI 的模块信息配置优先级关系梳理
  4. linux spring mvc tomcat配置,Spring MVC配置详解
  5. JS 数字,金额用逗号隔开
  6. 亚马逊:贝佐斯没有闹钟
  7. PHP Mysql-创建数据库
  8. todo: 网口驱动
  9. 古代汉语(王力版)笔记 通论8-9
  10. 关于百度导航SDK没声音的一种解决办法
  11. Android中添加商品的购物车
  12. Apache反向代理配置
  13. 快手开店怎么引流?快手小店自上线以来就吸引众多的商家入驻
  14. 还在用电脑多控手机?你out了,手机多控手机,全新神器
  15. 多重积分matlab
  16. c++单链表 一元多项式求和_C++一元多项式相加
  17. 国外问卷调查为什么这么热门?
  18. Oracle修改内存大小
  19. 西门子S7-200 SMART/828d PLC数据采集、远程调试
  20. oracle创建新指定表空间,oracle创建用户并指定表空间

热门文章

  1. CCF-CSP认证201312-1(出现次数最多的数)
  2. 第1章 数据分析概述
  3. 亲一下就搞定的事,绝不花钱解决!
  4. 圆周率里有每个人的银行卡密码和生日?混知乎的程序员果然都是神一般的存在...
  5. Vim文本编辑器 指令大全(二)
  6. python gdb coredump_Linux段错误及GDB Coredump调试方法
  7. z变换公式表_如何使用标准正态分布表?
  8. stm32l0的停止模式怎么唤醒_「正点原子STM32Mini板资料连载」第十九章 待机唤醒实验...
  9. 获取两个数据的交集_MySQL交集和差集的实现方法
  10. java树算法_Java数据结构算法(三)树