SP11470 TTM - To the moon
嘟嘟嘟
主席树+区间修改。
以为是水题,写着写着发现区间修改标记下传会出问题,然后想了想发现以前做的只是单点修改。
那怎么办咧?
然后题解交了我标记永久化这个神奇的东西。
特别好理解,就是修改的时候直接把多的就加到这个区间上,直到找到区间满足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)性能及规范下载,网友 ...
随机推荐
- 如何以管理员身份运行cmd
点击屏幕最左下角的“开始”按钮,选择“运行”命令: 在弹出的“运行”对话框中输入“CMD”命令,再单击“确定”按钮: 正常打开了DOS命令提示符窗口了.但是是“user”权限下: 有时,“ ...
- Chapter 4 Invitations——27
"Myself, obviously." He enunciated every syllable, as if he were talking to someone mental ...
- 写在最前面 - 《看懂每一行代码 - kubernetes》
我要写什么 <看懂每一行代码 - kubernetes>会包含k8s整个项目的源码解析,考虑到门槛问题,在开始分析k8s之前我会通过一些更低难度的golang开源项目讲解来帮助大家提升go ...
- 设计模式总结篇系列:代理模式(Proxy)
时代在发展,我们发现,现在不少明星都开始进行微访谈之类的,有越来越多的参与捐赠等.新的一天开始了,首先看下新的一天的日程安排: interface Schedule{ public void weiT ...
- Django 系列博客(八)
Django 系列博客(八) 前言 本篇博客介绍 Django 中的模板层,模板都是Django 使用相关函数渲染后传输给前端在显式的,为了想要渲染出我们想要的数据,需要学习模板语法,相关过滤器.标签 ...
- javascript基础修炼(7)——Promise,异步,可靠性
开发者的javascript造诣取决于对[动态]和[异步]这两个词的理解水平. 一. 别人是开发者,你也是 Promise技术是[javascript异步编程]这个话题中非常重要的,它一度让我感到熟悉 ...
- 第60章 设备流交互服务 - Identity Server 4 中文文档(v1.0.0)
该IDeviceFlowInteractionService接口旨在提供用户界面用于在设备流授权期间与IdentityServer通信的服务.它可以从依赖注入系统获得,通常作为构造函数参数注入到Ide ...
- c# ?? 和?
static void Main(string[] args) { double? num1 = null; // ? 说明num1可以为空 ...
- 【默认加入持久化机制,防止消息丢失,v0.0.3】对RabbitMQ.Client进行一下小小的包装,绝对实用方便
RabbitMQ是一个老牌的非微软的消息队列组件,一般来说应该能满足中小型公司对消息队列生产的需求,平时我们在.NET开发环境下运用它是可能会需要RabbitMQ.Client的SDK库,此库是官网提 ...
- [MySQL] 测试where group by order by的索引问题
1. select * from test where a=xx group by b order by c 如何加索引 CREATE TABLE `index_test` ( `id` int ...