prologue

还是太菜了,这个 154 行的树剖 20min 才敲完。

analysis

首先,处理这个给到我们的这个式子。

\[\max(| a _ u + a _ v |, | a _ u - a _ v |)
\]

我们可以分类讨论:

  • \(a > 0, b > 0\):

    显然 \(a + b > a - b\), 所以上式等于 $a + b \Rightarrow | a | + | b | $

  • \(a > 0, b < 0 \iff a < 0, b > 0\)

    这个时候,我们只需要讨论 \(a > 0, b < 0\) 的情况就好了。我们将 \(b\) 的符号拿出来,\(\Rightarrow a - (- | b |) \Rightarrow a + | b | \Rightarrow | a | + | b |\)

  • \(a < 0, b < 0\)

    操作同上, $ | -(| a | + | b |) | \Rightarrow | a | + | b | $。

综上:

\[\max(| a _ u + a _ v |, | a _ u - a _ v |) \iff | a | + | b |
\]

对于一条路径的询问,我们把每两个点之间的距离拿出来,不断累加,就可以知道,这一段路径的长度就是下式。(其中 \(dis _ {u \to v}\) 表示从 \(u\) 到 \(v\) 的距离, \(sum _ {u \to v}\) 表示从 \(u\) 到 \(v\) 的点值的绝对值之和,\(w_u\) 和 \(w_v\) 表示这两个点的点权)

\[dis _ {u \to v} = 2 \cdot sum _ {u \to v} - | w_u | - | w_v |
\]

之后就是正常实现一个树链剖分线段树即可。

code time

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rl register ll const ll N = 1e5 + 10, M = N << 1; ll n, m; ll tot, ne[M], e[M], h[N], w[N]; ll son[N], top[N], id[N], cnt, fa[N], dep[N], nw[N], sz[N]; struct node
{
ll l, r;
ll dis;
}tr[N << 2]; inline void add(ll a, ll b)
{
ne[++tot] = h[a], h[a] = tot, e[tot] = b;
} inline void dfs1(ll u, ll fath, ll depth)
{
fa[u] = fath, dep[u] = depth, sz[u] = 1; for(rl i=h[u]; ~i; i = ne[i])
{
ll v = e[i];
if(v == fath) continue;
dfs1(v, u, depth + 1);
sz[u] += sz[v];
if(sz[son[u]] < sz[v]) son[u] = v;
}
} inline void dfs2(ll u, ll t)
{
id[u] = ++ cnt, nw[cnt] = w[u], top[u] = t; if(!son[u]) return ;
dfs2(son[u], t); for(rl i=h[u]; ~i; i = ne[i])
{
ll v = e[i];
if(v == fa[u] || v == son[u]) continue;
dfs2(v, v);
}
} inline void pushup(ll u)
{
tr[u].dis = abs(tr[u << 1].dis) + abs(tr[u << 1 | 1].dis);
} inline void build(ll u, ll l, ll r)
{
tr[u] = {l, r, abs(nw[r])}; if(l == r) return ; ll mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r); pushup(u);
} inline void update(ll u, ll l, ll r, ll k)
{
if(tr[u].l == l && tr[u].l == tr[u].r)
{
tr[u].dis = k;
return ;
} ll mid = tr[u].l + tr[u].r >> 1; if(l <= mid) update(u << 1, l, r, k);
if(r > mid) update(u << 1 | 1, l, r, k); pushup(u);
} inline ll query(ll u, ll l, ll r)
{
ll res = 0; if(l <= tr[u].l && r >= tr[u].r) return tr[u].dis; ll mid = tr[u].l + tr[u].r >> 1; if(l <= mid) res += query(u << 1, l, r);
if(r > mid) res += query(u << 1 | 1, l, r); return res;
} inline void upd_point(ll u, ll k)
{
update(1, id[u], id[u], k);
} inline ll query_path(ll u, ll v)
{
ll res = - query(1, id[u], id[u]) - query(1, id[v], id[v]); while(top[u] != top[v])
{
if(dep[top[u]] < dep[top[v]]) swap(u, v);
res += 2 * query(1, id[top[u]], id[u]);
u = fa[top[u]];
} if(dep[u] < dep[v]) swap(u, v); res += 2 * query(1, id[v], id[u]); return res;
} int main()
{
// freopen("1.in", "r", stdin), freopen("1.out", "w", stdout); cin >> n >> m; memset(h, -1, sizeof h); for(rl i=1; i <= n; ++ i) cin >> w[i]; for(rl i=1; i < n; ++ i)
{
ll a, b;
cin >> a >> b;
add(a, b), add(b, a);
} dfs1(1, -1, 1);
dfs2(1, 1);
build(1, 1, n); while(m -- )
{
ll t, u, v;
cin >> t >> u >> v;
if(t == 1) upd_point(u, abs(v));
else cout << query_path(u, v) << endl;
} return 0;
}

CF1575I Illusions of the Desert的更多相关文章

  1. 【poj2728】Desert King

    [poj2728]Desert King 题意 最优比率生成树. http://blog.csdn.net/ophunter_lcm/article/details/10113817 分析 Dinke ...

  2. hdu-5703 Desert(水题)

    题目链接: Desert Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65535/32768 K (Java/Others) Pr ...

  3. poj 2728 Desert King (最小比例生成树)

    http://poj.org/problem?id=2728 Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissio ...

  4. POJ 2728 Desert King

    Description David the Great has just become the king of a desert country. To win the respect of his ...

  5. Desert King(最优比率生成树)

    Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 22717   Accepted: 6374 Desc ...

  6. POJ 2728 Desert King 最优比率生成树

    Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20978   Accepted: 5898 [Des ...

  7. Desert King POJ - 2728(最优比率生产树/(二分+生成树))

    David the Great has just become the king of a desert country. To win the respect of his people, he d ...

  8. POJ 2728 Desert King (01分数规划)

    Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions:29775   Accepted: 8192 Descr ...

  9. poj2728 Desert King【最优比率生成树】【Prim】【0/1分数规划】

    含[最小生成树Prim]模板. Prim复杂度为$O(n^2),适用于稠密图,特别是完全图的最小生成树的求解.   Desert King Time Limit: 3000MS   Memory Li ...

  10. 21 Survival of Desert Life 沙漠生命的延续

    Survival of Desert Life 沙漠生命的延续 ① Some desert animals can survive the very strong summer heat and dr ...

随机推荐

  1. 1.3 Metasploit 生成SSL加密载荷

    在本节中,我们将介绍如何通过使用Metasploit生成加密载荷,以隐藏网络特征.前一章节我们已经通过Metasploit生成了一段明文的ShellCode,但明文的网络传输存在安全隐患,因此本节将介 ...

  2. 如何使用libavfilter库给pcm音频采样数据添加音频滤镜?

    一.初始化音频滤镜 初始化音频滤镜的方法基本上和初始化视频滤镜的方法相同,不懂的可以看上篇博客,这里直接给出代码: //audio_filter_core.cpp #define INPUT_SAMP ...

  3. 体细胞突变检测分析流程-系列1( WES&Panel)

    Sentieon●体细胞变异检测-系列1   Sentieon 致力于解决生物信息数据分析中的速度与准确度瓶颈,通过算法的深度优化和企业级的软件工程,大幅度提升NGS数据处理的效率.准确度和可靠性. ...

  4. 最近很火的开源培训系统,支持免费商用,3个月1000star!

    项目简介 PlayEdu 开源培训系统自发布以来,3个月内帮助上千位开发者部署了私有化培训平台,并在 Github 上获得了1000star. 项目地址 Github 地址:https://githu ...

  5. Go优雅的错误处理: 支持错误堆栈, 错误码, 错误链的工具库

    地址: https://github.com/morrisxyang/errors 如果觉得有用欢迎 Star 和 PR, 有问题请直接提issue errors 简单的支持错误堆栈, 错误码, 错误 ...

  6. Centos 7安装dotnet 3.1

    # 注册 Microsoft 密钥和源 sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft- ...

  7. CF1794B Not Dividing题解

    如果 \(a_i\) 可以整除 \(a_{i - 1}\),只要在 \(a_i\) 上 \(+1\) 即可,这样 \(a_i \bmod a_{i - 1} = 1\) 就满足题目要求了,如果这样算来 ...

  8. 解决php中通过exec调用python脚本报ModuleNotFoundError错误

    背景 出于某些原因,我们有时会在PHP中通过exec来调用Python代码,有可能是某些功能只能用Python实现(或用Python实现比较方便),有可能是出于性能考虑(Python可以执行耗时任务) ...

  9. 前端Vue自定义开屏启动广告组件,点击广告图跳转广告详情

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身. 通过组件化开发,可以有 ...

  10. Java并发(十三)----共享存在的问题

    1.小故事 老王(操作系统)有一个功能强大的算盘(CPU),现在想把它租出去,赚一点外快 小南.小女(不同的线程)来使用这个算盘来进行一些计算,并按照时间给老王支付费用 但小南不能一天24小时使用算盘 ...