题目大意:给一棵基环树,两种操作:

  1. $1\;x\;y:$把第$x$条边长度改成$y$
  2. $2\;x\;y:$查询$x$到$y$的最短距离

题解:发现最短距离只有两种可能,第一个是树上的距离,第二种是经过多出来的一条边,都求出来比较一下就行了。修改时,若修改的是多出来的边,直接修改即可,若不是可以把它子树中所有点的距离修改,可以按$dfs$序变成区间修改

卡点:

C++ Code:

#include <cstdio>
#include <algorithm>
#define maxn 100010
int head[maxn], cnt = 1;
struct Edge {
int to, nxt, w;
} e[maxn << 1];
inline void add(int a, int b, int c) {
e[++cnt] = (Edge) {b, head[a], c}; head[a] = cnt;
e[++cnt] = (Edge) {a, head[b], c}; head[b] = cnt;
} int n, m, circle;
int l[maxn], r[maxn], w[maxn]; #define M 17
int fa[maxn][M], dep[maxn], sz[maxn];
int dfn[maxn], idx;
bool vis[maxn];
void dfs(int u, int father = 0) {
for (int i = 1; i < M; i++) fa[u][i] = fa[fa[u][i - 1]][i - 1];
vis[u] = true;
dfn[u] = ++idx;
sz[u] = 1;
for (int i = head[u]; i; i = e[i].nxt) if (i ^ father ^ 1) {
int v = e[i].to;
if (!vis[v]) {
*fa[v] = u;
dep[v] = dep[u] + 1;
dfs(v, i);
sz[u] += sz[v];
} else circle = i >> 1;
}
}
inline int LCA(int x, int y) {
if (x == y) return x;
if (dep[x] < dep[y]) std::swap(x, y);
for (int i = dep[x] - dep[y]; i; i &= i - 1) x = fa[x][__builtin_ctz(i)];
if (x == y) return x;
for (int i = M - 1; ~i; i--) if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
return *fa[x];
}
#undef M int last[maxn];
namespace BIT {
long long Tr[maxn], res;
inline void add(int p, int num) {for (; p <= n; p += p & -p) Tr[p] += num;}
inline int ask(int p) {for (res = 0; p; p &= p - 1) res += Tr[p]; return res;}
} inline void __modify(int u, int v, int w) {BIT::add(u, w), BIT::add(v + 1, -w);}
inline void modify(int u, int v, int w) {
if (dfn[u] > dfn[v]) std::swap(u, v);
__modify(dfn[v], dfn[v] + sz[v] - 1, w - ::last[v]); ::last[v] = w;
} inline long long dis(int x, int y) {return BIT::ask(dfn[x]) + BIT::ask(dfn[y]) - BIT::ask(dfn[LCA(x, y)]) * 2;}
inline long long solve(int x, int y) {
long long ans = dis(x, y);
ans = std::min(ans, dis(x, l[circle]) + dis(y, r[circle]) + w[circle]);
return std::min(ans, dis(x, r[circle]) + dis(y, l[circle]) + w[circle]);
} int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d%d%d", l + i, r + i, w + i);
add(l[i], r[i], w[i]);
}
dfs(1);
for (int i = 1; i <= n; i++) if (i != circle) modify(l[i], r[i], w[i]);
while (m --> 0) {
int op, x, y;
scanf("%d%d%d", &op, &x, &y);
if (op == 1) {
if (x == circle) w[circle] = y;
else modify(l[x], r[x], y);
} else printf("%lld\n", solve(x, y));
}
return 0;
}

  

[洛谷P4949]最短距离的更多相关文章

  1. POJ 1741.Tree and 洛谷 P4178 Tree-树分治(点分治,容斥版) +二分 模板题-区间点对最短距离<=K的点对数量

    POJ 1741. Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 34141   Accepted: 11420 ...

  2. 洛谷P2402 奶牛隐藏(网络流,二分答案,Floyd)

    洛谷题目传送门 了解网络流和dinic算法请点这里(感谢SYCstudio) 题目 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛 ...

  3. 洛谷P1342 请柬(SPFA)

    To 洛谷.1342 请柬 题目描述 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片.他们已经打印请帖和所有必要的信息和计 ...

  4. [NOIP2015提高&洛谷P2678]跳石头 题解(二分答案)

    [NOIP2015提高&洛谷P2678]跳石头 Description 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之 ...

  5. [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)

    洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...

  6. 洛谷P1027 Car的旅行路线

    洛谷P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...

  7. 洛谷2483 k短路([SDOI2010]魔法猪学院)

    题目请戳这里 一句话题意: 给你一张n个节点,m条单向边的图,求1到n第k短的路. emmm,纪念第一个黑题(我是真的菜啊!!) 这题目还是很难的,本蒟蒻只会被洛谷卡掉的A(所以就愉快地特判了),首先 ...

  8. 洛谷 P2483 BZOJ 1975 [SDOI2010]魔法猪学院

    题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...

  9. 洛谷 P1599 结算日

    洛谷 P1599 结算日 题目描述 “不放债不借债”,贝西多么希望自己可以遵循这个忠告.她已经和她的N(1 <= N <= 100,000)个朋友有了债务关系,或者借债了,或者放债了.她的 ...

随机推荐

  1. 基于ftp服务的三种登录方式及其相关的访问控制和优化

    ftp(简单文件传输协议),是一种应用广泛的网络文件传输协议和服务,占用20和21号端口,主要用于资源的上传和下载. 在linux对于ftp同widows一样具有很多的种类,这里主要介绍vsfptd( ...

  2. 糖果 南阳acm589

    糖果 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 topcoder工作室的PIAOYIi超级爱吃糖果,现在他拥有一大堆不同种类的糖果,他准备一口气把它们吃完,可是 ...

  3. DLX算法一览

    目录: 1 X思想的了解. 链表的递归与回溯. 具体操作. 优化. 一些应用与应用中的再次优化(例题). 练手题 X思想的了解. 首先了解DLX是什么? DLX是一种多元未饱和型指令集结构,DLX 代 ...

  4. Python自动化运维——系统进程管理模块

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 模块:psutil psutil是一个跨平台库,可以很轻松的为我们实现获取系统运行的进程和资源利用率等信息. 功能 ...

  5. (数据科学学习手札21)sklearn.datasets常用功能详解

    作为Python中经典的机器学习模块,sklearn围绕着机器学习提供了很多可直接调用的机器学习算法以及很多经典的数据集,本文就对sklearn中专门用来得到已有或自定义数据集的datasets模块进 ...

  6. ABAP CDS ON HANA-(11)ABAP CDSでの関連付け

    Association in ABAP CDS An association in CDS view joins different data sources. Defining and using ...

  7. Android面试收集录 2D绘图与动画技术

    1.如何在Android应用程序的窗口上绘制图形? 继承View 实现View中的onDraw()方法 2.如何绘制圆,空心椭圆? canvas.drawArc或canvas.drawCircle方法 ...

  8. netty源码分析系列文章

    netty源码分析系列文章 nettynetty源码阅读netty源码分析  想在年终之际将对netty研究的笔记记录下来,先看netty3,然后有时间了再写netty4的,希望对大家有所帮助,这个是 ...

  9. Memcached Hash算法

    本文来自网易云社区 作者:吕宗胜 Hash算法 1. Memcached Hash介绍 我们在前面的文章中已经介绍过了Memcached的内存管理方式,LRU的策略.由于Memcached的数据存储方 ...

  10. 【多线程】 Task

    [多线程] Task 一. 常用方法: 1. ContinueWith : 当前 Task 完成后, 执行传入的 Task 2. Delay : 创建一个等待的 Task,只有在调用 Wait 方法时 ...