F - Colorful Tree(LCA,树上差分,离线处理)
F - Colorful Tree
每次给定x,y,u,vx, y, u, vx,y,u,v,如果把颜色为xxx的边,边权修改为yyy,求u,vu, vu,v两点的距离,考虑
设num[i][x]num[i][x]num[i][x]为111到iii,颜色为xxx的数量,sum[i][x]sum[i][x]sum[i][x]为111到iii,颜色为xxx的边权和,
#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,树上差分,离线处理)相关推荐
- 洛谷P2680 运输计划(倍增LCA + 树上差分 + 二分答案)
[题目链接] [思路]: 根据题意可以明显看出,当所有任务都完成时的时间是最终的结果,也就是说本题要求,求出最小的最大值. 那这样的话就暗示了将答案二分,进行check. [check方法]: 如果说 ...
- 【HDU - 5452】Minimum Cut(树形dp 或 最近公共祖先lca+树上差分,转化tricks,思维)
题干: Given a simple unweighted graph GG (an undirected graph containing no loops nor multiple edges) ...
- HDU - 5452 Minimum Cut(LCA+树上差分)
题目链接:点击查看 题目大意:给出n个点,n-1条边组成一棵树,然后再给出m-n-1条边,组成一个图,现在要让我们求最少删去几条边才能让整个图不连通,并且要求只能在树上删去最多一条边 题目分析:这个题 ...
- P2680-运输计划【LCA,树上差分,二分答案】
正题 题目链接:https://www.luogu.org/problemnew/show/P2680 题目大意 一棵带权无根树,给出若干条路径.选择一条边使其边权变为0,要求路径的长度的最大值最小. ...
- [luogu P3128][USACO15DEC]Max Flow [LCA][树上差分]
题目描述 Farmer John has installed a new system of pipes to transport milk between the stalls in his b ...
- [JLOI2014]松鼠的新家 倍增LCA+树上差分
题目描述 题目 本来想写一道Tarjan的,结果发现这题倍增比较好写 这题主要要搞懂树上差分这东西(NOIP前这东西卡了我好久) 大概要注意的就是对于除了出发点以外的所有点都是重复算了的,所以最后要有 ...
- 松鼠的新家 LCA + 树上差分
题意 中文题意就不需要分析了吧 分析 首先两点之间,我们应该去走最短路径最能得到最优解,所以很容易想到求LCA,假设两点分别为x,y,LCA(x,y) = u,所以只需要把路径 x -> u - ...
- P3258[JLOI2014]松鼠的新家(LCA 树上差分)
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- codeforces1467 E. Distinctive Roots in a Tree(树上差分)
E. Distinctive Roots in a Tree 树上差分 如果当前节点u的某一棵子树中的某个节点的值和当前节点相同,那么除了当前节点这一棵子树节点,其他节点(其他子树以及u上面的节点)一 ...
最新文章
- Python字符串常用方法(二)
- Java定时任务调度工具
- YUI 的模块信息配置优先级关系梳理
- linux spring mvc tomcat配置,Spring MVC配置详解
- JS 数字,金额用逗号隔开
- 亚马逊:贝佐斯没有闹钟
- PHP Mysql-创建数据库
- todo: 网口驱动
- 古代汉语(王力版)笔记 通论8-9
- 关于百度导航SDK没声音的一种解决办法
- Android中添加商品的购物车
- Apache反向代理配置
- 快手开店怎么引流?快手小店自上线以来就吸引众多的商家入驻
- 还在用电脑多控手机?你out了,手机多控手机,全新神器
- 多重积分matlab
- c++单链表 一元多项式求和_C++一元多项式相加
- 国外问卷调查为什么这么热门?
- Oracle修改内存大小
- 西门子S7-200 SMART/828d PLC数据采集、远程调试
- oracle创建新指定表空间,oracle创建用户并指定表空间
热门文章
- CCF-CSP认证201312-1(出现次数最多的数)
- 第1章 数据分析概述
- 亲一下就搞定的事,绝不花钱解决!
- 圆周率里有每个人的银行卡密码和生日?混知乎的程序员果然都是神一般的存在...
- Vim文本编辑器 指令大全(二)
- python gdb coredump_Linux段错误及GDB Coredump调试方法
- z变换公式表_如何使用标准正态分布表?
- stm32l0的停止模式怎么唤醒_「正点原子STM32Mini板资料连载」第十九章 待机唤醒实验...
- 获取两个数据的交集_MySQL交集和差集的实现方法
- java树算法_Java数据结构算法(三)树