「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 的活动. 因为 ...
随机推荐
- thinkphp5分页查询paginate()传递参数
使用paginate()分页,我这里实现的是搜索后分页显示,翻页后传递搜索关键字 www.demo.com/home/search/?k=搜索关键字&page=2 搜索分页源码在: think ...
- vue—生命周期的基本介绍
Vue生命周期: 什么是生命周期: Vue 实例从创建到销毁的过程,就是生命周期.也就是从开始创建.初始化数据.编译模板.挂载Dom→渲染.更新→渲染.卸载等一系列过程,我们称这是 Vue 的生命周期 ...
- 第八章 ZYNQ-MIZ701 软硬调试高级技巧
软件和硬件的完美结合才是SOC的优势和长处,那么开发ZYNQ就需要掌握软件和硬件开发的调试技巧,这样才能同时分析软件或者硬件的运行情况,找到问题,最终解决.那么本章将通过一个简单的例子带大家使用v ...
- 【Trie】The XOR Largest Pair
[题目链接] https://loj.ac/problem/10050 [题意] 给出n个数,其中取出两个数来,让其异或值最大. [题解] 经典的01字典树问题. 首先需要把01字典树建出来. 然后对 ...
- shell习题第11题:输入数字执行命令
[题目要求] 写一个脚本实现如下功能:输入一个数字,然后运行对应的一个命令 显示命令如下: *cmd menu* 1--data 2--ls 3--who 4--pwd 输入1时,会运行data [ ...
- 第一讲,DOS头文件格式
今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 简短的说明. 我们要知道,PE文件格式,是微 ...
- AutoFac实现程序集级别的依赖注入
1.介绍 所谓程序集级别的依赖注入是指接口和实现的依赖不使用配置文件或硬代码实现(builder.RegisterType<UserInfoService>().As<IU ...
- spark application调度机制(spreadOutApps,oneExecutorPerWorker 算法)
1.要想明白spark application调度机制,需要回答一下几个问题: 1.谁来调度? 2.为谁调度? 3.调度什么? 3.何时调度? 4.调度算法 前四个问题可以用如下一句话里来回答:每当集 ...
- sql server 查看表中某一字段的排序规则
SELECT o.name,o.object_id,c.name,c.column_id,c.collation_name FROM sys.columns c JOIN sys.obj ...
- FlowPortal BPM 安装环境的配置
l 操作系统:Windows Server 2003 及以上: l IIS: 在Internet信息服务(IIS)管理器中将ISAPI和CGI限制全部设为“允许” l 需要安装.Net Fram ...