CF1575I Illusions of the Desert
prologue
还是太菜了,这个 154 行的树剖 20min 才敲完。
analysis
首先,处理这个给到我们的这个式子。
\]
我们可以分类讨论:
\(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 | $。
综上:
\]
对于一条路径的询问,我们把每两个点之间的距离拿出来,不断累加,就可以知道,这一段路径的长度就是下式。(其中 \(dis _ {u \to v}\) 表示从 \(u\) 到 \(v\) 的距离, \(sum _ {u \to v}\) 表示从 \(u\) 到 \(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的更多相关文章
- 【poj2728】Desert King
[poj2728]Desert King 题意 最优比率生成树. http://blog.csdn.net/ophunter_lcm/article/details/10113817 分析 Dinke ...
- hdu-5703 Desert(水题)
题目链接: Desert Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Pr ...
- poj 2728 Desert King (最小比例生成树)
http://poj.org/problem?id=2728 Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissio ...
- POJ 2728 Desert King
Description David the Great has just become the king of a desert country. To win the respect of his ...
- Desert King(最优比率生成树)
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 22717 Accepted: 6374 Desc ...
- POJ 2728 Desert King 最优比率生成树
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20978 Accepted: 5898 [Des ...
- 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 ...
- POJ 2728 Desert King (01分数规划)
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions:29775 Accepted: 8192 Descr ...
- poj2728 Desert King【最优比率生成树】【Prim】【0/1分数规划】
含[最小生成树Prim]模板. Prim复杂度为$O(n^2),适用于稠密图,特别是完全图的最小生成树的求解. Desert King Time Limit: 3000MS Memory Li ...
- 21 Survival of Desert Life 沙漠生命的延续
Survival of Desert Life 沙漠生命的延续 ① Some desert animals can survive the very strong summer heat and dr ...
随机推荐
- 1. Spring 简介
1. Spring 概述 官网地址:https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框 ...
- 嵌入式低功耗WiFi设备保活功耗分析
(一)嵌入式低功耗设备介绍 在物联网(IoT)领域,设备可以使用以太网和无线网进行网络连接. 以太网: 网络稳定,带宽高,延迟低,但是以太网需要拉网布线,设备安装邻活便利性能差. 无线网络:安装位置灵 ...
- 打开页面就能玩?ZEGO 发布行业首套 Web 端在线 KTV 解决方案
近些年,在线K歌行业逐渐开始规模化发展,活跃用户不断破新高,据 ZEGO 即构科技研究院数据显示,2021 年中国在线 K 歌用户规模逾 5.2亿,网民渗透率达到 50%. 凭借着极大的便利性和娱乐性 ...
- GaussDB技术解读丨高级压缩
本文作者|华为云数据库GaussDB首席架构师 冯柯 [背景介绍] 数据压缩与关系数据库的结合,早已不是一个新鲜的话题,当前我们已经看到了各种各样数据库压缩的产品和解决方案.对于GaussDB来说,在 ...
- Oracle批量处理SQL
批量更新且更新字段数字需要递增 示例: DECLARE n int; -- 定义变量 BEGIN n:=1000010; --为n 赋值 FOR i IN (SELECT AGENCY.ID FROM ...
- Ubuntu Ctrl + Alt + [F1~F6] 图形化终端与命令行终端
在20.04的版本中,F1和F2是两个图形化终端,可以登陆不同的用户.(如果是相同的用户登陆,则进入的是同一个终端.) F4-F6都是命令行终端,即便使用相同的用户登陆,也是打开不同的终端. 说明,命 ...
- 关于NOI2010“超级钢琴”的反思
[NOI2010] 超级钢琴 题目描述 小 Z 是一个小有名气的钢琴家,最近 C 博士送给了小 Z 一架超级钢琴,小 Z 希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出 \(n\ ...
- 查看Nginx是否启动
查看Nginx进程 ps -ef | grep nginx 输出如下: root 1036 1 0 Jul15 ? 00:00:00 nginx: master process /www/server ...
- 文心一言 VS 讯飞星火 VS chatgpt (70)-- 算法导论6.5 9题
九.请设计一个时间复杂度为 (n lgk)的算法,它能够将 k 个有序链表合并为一个有序链表,这里 n 是所有输入链表包含的总的元素个数.(提示:使用最小堆来完成 k 路归并. 文心一言: 要设计一个 ...
- Tcpdump 使用指南
论网络数据包的分析,我首选wireshark,因为图形化界面直观明了.但如果遇到没有图形化显示的Linux环境,那么此时会使用tcpdump该是一件多么美好的事情. 网上关于tcpdump的介绍很多, ...