「SPOJ TTM 」To the moon「标记永久化」
题意
概括为主席树区间加区间询问
题解
记录一下标记永久化的方法。每个点存add和sum两个标记,表示这个区间整个加多少,区间和是多少(这个区间和不包括祖先结点区间加)
然后区间加的时候,给路上每结点的sum更新,然后到达完整区间后更新add。询问的时候把路径上所有结点(不包括自己)的add加起来乘以区间长度,再加上sum
大概思想就是:区间内的加法用sum维护,区间外的加法询问的时候再考虑贡献
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int n, m, a[N];
int T[N], id, L[N << 6], R[N << 6];
ll s[N << 6], add[N << 6];
void build(int &rt, int l, int r) {
rt = ++ id;
if(l < r) {
int mid = (l + r) >> 1;
build(L[rt], l, mid);
build(R[rt], mid + 1, r);
s[rt] = s[L[rt]] + s[R[rt]];
} else s[rt] = a[l];
}
void update(int &rt, int pre, int l, int r, int ql, int qr, int x) {
rt = ++ id; L[rt] = L[pre]; R[rt] = R[pre];
s[rt] = s[pre] + (qr - ql + 1) * x; add[rt] = add[pre];
if(ql == l && r == qr) { add[rt] += x; return ; }
int mid = (l + r) >> 1;
if(qr <= mid) update(L[rt], L[pre], l, mid, ql, qr, x);
else if(ql > mid) update(R[rt], R[pre], mid + 1, r, ql, qr, x);
else {
update(L[rt], L[pre], l, mid, ql, mid, x);
update(R[rt], R[pre], mid + 1, r, mid + 1, qr, x);
}
}
ll query(int rt, int l, int r, int ql, int qr, ll sum = 0) {
if(ql == l && qr == r) return sum * (r - l + 1) + s[rt];
sum += add[rt];
int mid = (l + r) >> 1;
if(qr <= mid) return query(L[rt], l, mid, ql, qr, sum);
if(ql > mid) return query(R[rt], mid + 1, r, ql, qr, sum);
return query(L[rt], l, mid, ql, mid, sum) + query(R[rt], mid + 1, r, mid + 1, qr, sum);
}
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++)
scanf("%d", a + i);
static char op[5];
int tnow = 0; build(T[0], 1, n);
for(int l, r, d, i = 1; i <= m; i ++) {
scanf("%s", op);
if(* op == 'C') {
scanf("%d%d%d", &l, &r, &d);
update(T[tnow + 1], T[tnow], 1, n, l, r, d);
tnow ++;
}
if(* op == 'Q') {
scanf("%d%d", &l, &r);
printf("%lld\n", query(T[tnow], 1, n, l, r));
}
if(* op == 'H') {
scanf("%d%d%d", &l, &r, &d);
printf("%lld\n", query(T[d], 1, n, l, r));
}
if(* op == 'B') {
scanf("%d", &tnow);
}
}
return 0;
}
「SPOJ TTM 」To the moon「标记永久化」的更多相关文章
- 「SPOJ 3105」Power Modulo Inverted
「SPOJ 3105」Power Modulo Inverted 传送门 题目大意: 求关于 \(x\) 的方程 \[a^x \equiv b \;(\mathrm{mod}\; p) \] 的最小自 ...
- 何解決 LinqToExcel 發生「無法載入檔案或組件」問題何解決 LinqToExcel 發生「無法載入檔案或組件」問題
在自己的主機上透過 Visual Studio 2013 與 IISExpress 開發與測試都還正常,但只要部署到測試機或正式機,就是沒辦法順利執行,卡關許久之後找我協助.我發現錯誤訊息確實很「一般 ...
- FileUpload控件「批次上传 / 多档案同时上传」的范例--以「流水号」产生「变量名称」
原文出處 http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/19/multiple_fileupload_asp_net_20130819. ...
- 「前端开发者」如何把握住「微信小程序」这波红利?
由于前两周一直在老家处理重要事情,虽然朋友圈被「微信小程序」刷爆了,但并没有时间深入了解. 昨天回广州之后,第一件事情就是把「微信小程序」相关的文章.开发文档.设计规范全部看了一遍,基本上明白了「微信 ...
- 2018.08.04 spoj TTM to the moon(主席树)
spoj传送门 vjudge传送门 主席树板子题. 支持历史版本的区间和,区间和,区间修改和时光倒流. 其中新奇一点的也只有区间修改了,这个东西直接标记永久化就行了. 如果想下传标记的话也行,需要在p ...
- SPOJ - TTM 主席树
给你一个系列\(a[1...n]\),要求可以区间求和,区间更新,也可以回溯过去 经典的主席树板子题,很久以前做的题了,代码太丑回炉重写 PS.题目标题To The Moon也是我最喜欢的游戏之一 这 ...
- SPOJ 16549 - QTREE6 - Query on a tree VI 「一种维护树上颜色连通块的操作」
题意 有操作 $0$ $u$:询问有多少个节点 $v$ 满足路径 $u$ 到 $v$ 上所有节点(包括)都拥有相同的颜色$1$ $u$:翻转 $u$ 的颜色 题解 直接用一个 $LCT$ 去暴力删边连 ...
- 「 SPOJ GSS3 」 Can you answer these queries III
# 题目大意 GSS3 - Can you answer these queries III 需要你维护一种数据结构,支持两种操作: 单点修改 求一个区间的最大子段和 # 解题思路 一个区间的最大子段 ...
- 被「李笑来老师」拉黑之「JavaScript微博自动转发的脚本」
故事的背景如下图,李笑来 老师于10月19日在 知乎Live 开设 一小时建立终生受用的阅读操作系统 的讲座,他老人家看到大家伙报名踊跃,便在微博上发起了一个 猜数量赢取iPhone7 的活动. 因为 ...
随机推荐
- Photon Server 实现注册与登录(二) --- 服务端代码整理
一.有的代码前端和后端都会用到.比如一些请求的Code.使用需要新建项目存放公共代码. 新建项目Common存放公共代码: EventCode :存放服务端自动发送信息给客户端的code Operat ...
- Numpy学习之——数组创建
Numpy学习之--数组创建 过程展示 import numpy as np a = np.array([2,3,9]) a array([2, 3, 9]) a.dtype dtype('int32 ...
- linux下shell 脚本 中windows换行符换成linux换行符
sed -i 's/\r//' filename window下默认是 \r\n linux下是\n unix下是\r
- Unity Button延迟功能
有时候Button点下去不是要求立即反应的,而是先有个特别短的动画,再反应. 实现: 继承Button,然后重写一下OnPointerClick,利用协程来延迟. using System.Colle ...
- 适配方案(五)适配的基础知识之设备像素比 dpr 与 1px 物理像素
设备像素比 dpr 与 1px 物理像素 物理像素(physical pixel) 手机屏幕上显示的最小单元,该最小单元具有颜色及亮度的属性可供设置,iphone6.7.8 为:750 * 1334, ...
- 关于Mybatis的几件小事(一)
一.Mybatis简介 1.Mybatis简介 MyBatis是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集. M ...
- js重点——作用域——内部原理(二)
本篇是深入分析和理解作用域的第一篇——内部原理和工作模型. 我们知道作用域是变量,对象,函数可访问的一个范围.这说明了我们需要一套良好的规则来存储变量,之后方便查找.所以我们首先要理解的是在哪里而且怎 ...
- 【转】Fetch超时设置和终止请求
原文链接:https://www.cnblogs.com/yfrs/p/fetch.html 1.基本使用 Fetch 是一个新的端获取资源的接口,用于替换笨重繁琐XMLHttpRequest.它有了 ...
- ONNX预训练模型加载
tvm官网中,对从ONNX预训练模型中加载模型的教程说明 教程来自于:https://docs.tvm.ai/tutorials/frontend/from_onnx.html#sphx-glr-tu ...
- 每天一个Linux命令之:chage
命令简介: 该命令用于密码时效管理.它可以修改账号和密码的有效期.对于chage命令的描述如下所示: The chage command changes the number of days betw ...