SP11470 TTM - To the moon

时间:2021-09-19 13:59:42

嘟嘟嘟



主席树+区间修改。



以为是水题,写着写着发现区间修改标记下传会出问题,然后想了想发现以前做的只是单点修改。

那怎么办咧?

然后题解交了我标记永久化这个神奇的东西。

特别好理解,就是修改的时候直接把多的就加到这个区间上,直到找到区间满足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的更多相关文章

  1. SP11470 TTM - To the moon&lbrack;主席树标记永久化&rsqb;

    SP11470 TTM - To the moon C l r d:区间 \([L,R]\) 中的数都加 d ,同时当前的时间戳加 1. Q l r:查询当前时间戳区间 \([L,R]\) 中所有数的 ...

  2. 「SP11470」TTM - To the moon

    题目描述 给定一段长度为 \(N\) 的序列 \(a\) 以及 \(M\) 次操作,操作有以下几种: C l r d :将区间 \([l,r]\) 中的数都加上 \(d\) Q l r :查询当前时间 ...

  3. HDU 4348&period;To the moon SPOJ - TTM To the moon -可持久化线段树&lpar;带修改在线区间更新&lpar;增减&rpar;、区间求和、查询历史版本、回退到历史版本、延时标记不下放&lpar;空间优化&rpar;&rpar;

    To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  4. 2018&period;08&period;04 spoj TTM to the moon(主席树)

    spoj传送门 vjudge传送门 主席树板子题. 支持历史版本的区间和,区间和,区间修改和时光倒流. 其中新奇一点的也只有区间修改了,这个东西直接标记永久化就行了. 如果想下传标记的话也行,需要在p ...

  5. 洛谷——P3919 【模板】可持久化数组(可持久化线段树&sol;平衡树)

    P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...

  6. &lbrack;学习笔记&rsqb; 可持久化线段树&amp&semi;主席树

    众所周知,线段树是一个非常好用也好写的数据结构, 因此,我们今天的前置技能:线段树. 然而,可持久化到底是什么东西? 别急,我们一步一步来... step 1 首先,一道简化的模型: 给定一个长度为\ ...

  7. 「SPOJ TTM 」To the moon「标记永久化」

    题意 概括为主席树区间加区间询问 题解 记录一下标记永久化的方法.每个点存add和sum两个标记,表示这个区间整个加多少,区间和是多少(这个区间和不包括祖先结点区间加) 然后区间加的时候,给路上每结点 ...

  8. HDU 4348 SPOJ 11470 To the moon

    Vjudge题面 Time limit 2000 ms Memory limit 65536 kB OS Windows Source 2012 Multi-University Training C ...

  9. Moon&period;Orm 入门总指南

    注意:下面的pdf文件强烈建议下载或在线查看 1)旗舰版帮助文档点击查看或下载 2)http://pan.baidu.com/s/1hq7krFu(新手手册下载)(强烈推荐) 3)性能及规范下载,网友 ...

随机推荐

  1. javascript的垃圾收集机制

    × 目录 [1]原理 [2]标记清除 [3]引用计数[4]性能问题[5]内存管理 前面的话 javascript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存.在编写javascri ...

  2. ibatis输入多个参数

    ibatis输入多个参数     在ibatis中,会发现其输入参数只能有一个,于是当出现需要进行多个输入参数的时候,就要想点办法了,我看到的有以下两种比较好的方法能够解决这个问题1) 用String ...

  3. DataTables 控件使用和心得 &lpar;2&rpar; - 参数Options

    什么是DataTables参数(Options) 上篇我们说了,DataTables控件的加载函数dataTable()一般都有一个对象参数,这个对象参数就是整个DataTables控件的参数(Opt ...

  4. java类加载器-Tomcat类加载器

    在上文中,已经介绍了系统类加载器以及类加载器的相关机制,还自定制类加载器的方式.接下来就以tomcat6为例看看tomat是如何使用自定制类加载器的.(本介绍是基于tomcat6.0.41,不同版本可 ...

  5. org&period;hibernate&period;hql&period;ast&period;QuerySyntaxException&colon; XXX is not mapped

    因为 String sql2 = "select s from Student s where s.clazz.name=:name"; 此处的 Student 应该为类名.hql ...

  6. discourse 基于ember&period;js&plus;rails项目的安装部署

    最近公司在讨论做一个ERP运维问答的论坛系统,看了很多开源系统,觉得discourse功能比较完善,灵活.可配置性非常好,部署方便,瀑布流的主题布局模式也很符合未来论坛的趋势,于是在 ucloud 上 ...

  7. 为什么Android 3&period;0如此罕见?

    3.0(2011年2月)代号蜂巢,专用于android系统的平板电脑,不用于手机.4.0(2011年5月公布)的开发就是让平板电脑和手机能够共用一个版本的系统.4.0通用于平板电脑和手机.

  8. 【HDOJ】4737 A Bit Fun

    水题.不过题目很有趣儿. #include <cstdio> #define MAXN 100005 int a[MAXN]; int main() { int t, n, m; int ...

  9. python 缩进导致的问题

    今天写Python 看着没有问题 运行就各种问题 object has no attribute 最后发现 Vim 设置里面有个  tabstop  我设置的是4 应该设置成8

  10. Native、Web App、Hybrid、React Native(简称RN)、Weex 间的异同点。

    App常用开发模式简介 此处App为应用application,并非我们通常讲的手机App. 常用的几种APP开发模式-脑图 Native App 传统的原生App开发模式,有iOS和aOS两大系统, ...