「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 实现注册与登录(一) --- Hibernate整合到项目中
本系列实现目的:基于Photon Server实现注册于登录 一.拷贝Nbibernate项目的文件到MyGamerServer项目中. 二.数据库新建表,结构如下 三.修改文件名和配置 (1).将拷 ...
- python并发编程之多进程(实践篇)
一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了multiproce ...
- DFA与动态规划
1.牛客练习赛45 A 给定字符串, 求字符不相邻的"QAQ"子序列个数. $dp[i][0]$ 只匹配一个'Q'的方案数的前缀和. $dp[i][1]$ 只匹配"QA& ...
- 手写map, filter函数
function map(arr, fn) { let newArr = []; for (let i = 0; i < arr.length; i++) { newArr[i] = fn(ar ...
- http、tcp简述
网络简述第一章 http.tcp简述 一.网络7层协议从上到下分别是 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 : 其中高层(即7.6.5.4层)定 ...
- 使用 SQL的 for xml path来进行字符串拼接
本篇主要讲怎么利用SQL的FOR XML PATH 参数来进行字符串拼接,FOR XML PATH的用法很简单,它会以xml文件的形式来返回数据. 我的讲解步骤: 1:构造初始数据 2:提出问题 3: ...
- LeetCode:184.部门工资最高的员工
题目链接:https://leetcode-cn.com/problems/department-highest-salary/ 题目 Employee 表包含所有员工信息,每个员工有其对应的 Id, ...
- 小程序wxs价格显示小数点后两位
function toFix(data, val) { var numbers = ''; for (var i = 0; i < val; i++) { numbers += '0'; } v ...
- ReactNative 踩坑笔记
1.fatal error: 'React/RCTBridgeDelegate.h' file not found 这个问题是应为没有安装cocoaPods 所以无法安装ios需要的第三方库.安装co ...
- 如何将公式插入到word
平台:win10 x64+ office 2010+ Mathpix Snipping Tool +mathtype6.9b 直接安装就行,下载好了以后,要和word连接起来还需要下载一个插件,有 ...