嘟嘟嘟
主席树+区间修改。
以为是水题,写着写着发现区间修改标记下传会出问题,然后想了想发现以前做的只是单点修改。
那怎么办咧?
然后题解交了我标记永久化这个神奇的东西。
特别好理解,就是修改的时候直接把多的就加到这个区间上,直到找到区间满足l == L && r == R
,这时候再打个标记。然后查询的时候每一次应该在加上lzy[now] * (R - L + 1)
就吼了!
这么看来还是一个水题
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 4e6 + 5;
inline ll read()
{
ll ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
}
char s[2];
int n, m;
struct Tree
{
int ls, rs;
ll sum, lzy;
}t[maxn];
int root[maxn], tcnt = 0, tim = 0;
In void build(int& now, int L, int R)
{
now = ++tcnt;
if(L == R) {t[now].sum = read(); return;}
int mid = (L + R) >> 1;
build(t[now].ls, L, mid);
build(t[now].rs, mid + 1, R);
t[now].sum = t[t[now].ls].sum + t[t[now].rs].sum;
}
In void update(int old, int& now, int l, int r, int L, int R, ll d)
{
t[now = ++tcnt] = t[old];
t[now].sum += d * (R - L + 1);
if(l == L && r == R) {t[now].lzy += d; return;}
int mid = (l + r) >> 1;
if(R <= mid) update(t[old].ls, t[now].ls, l, mid, L, R, d);
else if(L > mid) update(t[old].rs, t[now].rs, mid + 1, r, L, R, d);
else update(t[old].ls, t[now].ls, l, mid, L, mid, d), update(t[old].rs, t[now].rs, mid + 1, r, mid + 1, R, d);
}
In ll query(int now, int l, int r, int L, int R)
{
if(l == L && r == R) return t[now].sum;
int mid = (l + r) >> 1;
ll ret = t[now].lzy * (R - L + 1);
if(R <= mid) ret += query(t[now].ls, l, mid, L, R);
else if(L > mid) ret += query(t[now].rs, mid + 1, r, L, R);
else ret += query(t[now].ls, l, mid, L, mid) + query(t[now].rs, mid + 1, r, mid + 1, R);
return ret;
}
int main()
{
n = read(), m = read();
build(root[0], 1, n);
for(int i = 1; i <= m; ++i)
{
scanf("%s", s);
if(s[0] == 'C')
{
int L = read(), R = read(), d = read();
++tim;
update(root[tim - 1], root[tim], 1, n, L, R, d);
}
else if(s[0] == 'Q')
{
int L = read(), R = read();
write(query(root[tim], 1, n, L, R)), enter;
}
else if(s[0] == 'H')
{
int L = read(), R = read(), t = read();
write(query(root[t], 1, n, L, R)), enter;
}
else
{
int t = read();
if(t ^ tim) tim = t, tcnt = root[tim + 1] - 1;
//这么写算是垃圾回收
}
}
return 0;
}
SP11470 TTM - To the moon的更多相关文章
-
SP11470 TTM - To the moon[主席树标记永久化]
SP11470 TTM - To the moon C l r d:区间 \([L,R]\) 中的数都加 d ,同时当前的时间戳加 1. Q l r:查询当前时间戳区间 \([L,R]\) 中所有数的 ...
-
「SP11470」TTM - To the moon
题目描述 给定一段长度为 \(N\) 的序列 \(a\) 以及 \(M\) 次操作,操作有以下几种: C l r d :将区间 \([l,r]\) 中的数都加上 \(d\) Q l r :查询当前时间 ...
-
HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
-
2018.08.04 spoj TTM to the moon(主席树)
spoj传送门 vjudge传送门 主席树板子题. 支持历史版本的区间和,区间和,区间修改和时光倒流. 其中新奇一点的也只有区间修改了,这个东西直接标记永久化就行了. 如果想下传标记的话也行,需要在p ...
-
洛谷——P3919 【模板】可持久化数组(可持久化线段树/平衡树)
P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...
-
[学习笔记] 可持久化线段树&;主席树
众所周知,线段树是一个非常好用也好写的数据结构, 因此,我们今天的前置技能:线段树. 然而,可持久化到底是什么东西? 别急,我们一步一步来... step 1 首先,一道简化的模型: 给定一个长度为\ ...
-
「SPOJ TTM 」To the moon「标记永久化」
题意 概括为主席树区间加区间询问 题解 记录一下标记永久化的方法.每个点存add和sum两个标记,表示这个区间整个加多少,区间和是多少(这个区间和不包括祖先结点区间加) 然后区间加的时候,给路上每结点 ...
-
HDU 4348 SPOJ 11470 To the moon
Vjudge题面 Time limit 2000 ms Memory limit 65536 kB OS Windows Source 2012 Multi-University Training C ...
-
Moon.Orm 入门总指南
注意:下面的pdf文件强烈建议下载或在线查看 1)旗舰版帮助文档点击查看或下载 2)http://pan.baidu.com/s/1hq7krFu(新手手册下载)(强烈推荐) 3)性能及规范下载,网友 ...
随机推荐
-
javascript的垃圾收集机制
× 目录 [1]原理 [2]标记清除 [3]引用计数[4]性能问题[5]内存管理 前面的话 javascript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存.在编写javascri ...
-
ibatis输入多个参数
ibatis输入多个参数 在ibatis中,会发现其输入参数只能有一个,于是当出现需要进行多个输入参数的时候,就要想点办法了,我看到的有以下两种比较好的方法能够解决这个问题1) 用String ...
-
DataTables 控件使用和心得 (2) - 参数Options
什么是DataTables参数(Options) 上篇我们说了,DataTables控件的加载函数dataTable()一般都有一个对象参数,这个对象参数就是整个DataTables控件的参数(Opt ...
-
java类加载器-Tomcat类加载器
在上文中,已经介绍了系统类加载器以及类加载器的相关机制,还自定制类加载器的方式.接下来就以tomcat6为例看看tomat是如何使用自定制类加载器的.(本介绍是基于tomcat6.0.41,不同版本可 ...
-
org.hibernate.hql.ast.QuerySyntaxException: XXX is not mapped
因为 String sql2 = "select s from Student s where s.clazz.name=:name"; 此处的 Student 应该为类名.hql ...
-
discourse 基于ember.js+rails项目的安装部署
最近公司在讨论做一个ERP运维问答的论坛系统,看了很多开源系统,觉得discourse功能比较完善,灵活.可配置性非常好,部署方便,瀑布流的主题布局模式也很符合未来论坛的趋势,于是在 ucloud 上 ...
-
为什么Android 3.0如此罕见?
3.0(2011年2月)代号蜂巢,专用于android系统的平板电脑,不用于手机.4.0(2011年5月公布)的开发就是让平板电脑和手机能够共用一个版本的系统.4.0通用于平板电脑和手机.
-
【HDOJ】4737 A Bit Fun
水题.不过题目很有趣儿. #include <cstdio> #define MAXN 100005 int a[MAXN]; int main() { int t, n, m; int ...
-
python 缩进导致的问题
今天写Python 看着没有问题 运行就各种问题 object has no attribute 最后发现 Vim 设置里面有个 tabstop 我设置的是4 应该设置成8
-
Native、Web App、Hybrid、React Native(简称RN)、Weex 间的异同点。
App常用开发模式简介 此处App为应用application,并非我们通常讲的手机App. 常用的几种APP开发模式-脑图 Native App 传统的原生App开发模式,有iOS和aOS两大系统, ...