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)性能及规范下载,网友 ...
随机推荐
- 如何判断DataSet里有多少个DataTable
dataset.table.count sda.fill(ds,"table"); //这里是在ds里新建了一个表,叫table,注意是新建,多次执行会报错,实际使用时,可以用co ...
- [软件开发技巧]·树莓派极简安装OpenCv
树莓派极简安装OpenCv 个人主页–> https://xiaosongshine.github.io/ 因为最近在开发使用树莓派+usb摄像头识别模块,打算用OpenCv,发现网上的树莓派O ...
- leetcode — surrounded-regions
import java.util.Arrays; import java.util.Stack; /** * Source : https://oj.leetcode.com/problems/sur ...
- 流式大数据计算实践(7)----Hive安装
一.前言 1.这一文学习使用Hive 二.Hive介绍与安装 Hive介绍:Hive是基于Hadoop的一个数据仓库工具,可以通过HQL语句(类似SQL)来操作HDFS上面的数据,其原理就是将用户写的 ...
- MySQLSource-Flume
1. 自定义Source说明 实时监控MySQL,从MySQL中获取数据传输到HDFS或者其他存储框架,所以此时需要我们自己实现MySQLSource. 2. 自定义MySQLSource步骤 根据官 ...
- [转]Gitlab-CI持续集成之Runner配置和CI脚本
本文转自:https://www.cnblogs.com/jiukun/p/7481287.html 一.简介 1. 为实现持续集成,需为该项目准备以下两样东西: 1)软件集成脚本.(gitlab-c ...
- MVC架构中的Repository模式 个人理解
关于MVC架构中的Repository模式 个人理解:Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间.它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接 ...
- IOC,DIP,DI,IoC容器
定义 IOC(Inversion of Control 控制反转),DIP(Dependency Inverson Principle 依懒倒置)都属于设计程序时指导原则,并没有具体的实现.比较常用 ...
- 微信小程序异步请求问题
微信小程序为了提高用户体验,提供的api大部分都是异步操作,除了数据缓存操作里面有一些同步操作.是提高了用户体验,但是在开发的时候, 就有点坑了,例如我要写一个公共方法,发起网络请求,去后台去一些数据 ...
- 洛谷P5108 仰望半月的夜空(后缀数组)
题意 题目链接 Sol warning:下面这个做法只有95分,本地拍了1w+组都没找到错误我表示十分无能为力 我们考虑每个串的排名去更新答案,显然排名为\(1\)的后缀的前缀一定是当前长度的字典序最 ...