HDU 4383 To The Moon 解题报告
HDU 4383 To The Moon
题意翻译
已知一个长为\(n\)的序列\(a\),你需要进行下面的四种操作。
C l r d
将区间\([l,r]\)中的数加上\(d\),同时时间加\(1\)
Q l r
查询当前时间区间\([l,r]\)中所有数的和
H l r t
查询时间为\(t\)时区间\([l,r]\)中所有数的和
B t
将当前时间置为\(t\)
输入输出格式
输入格式
多组数据
每组数据第一行两个整数\(n,m\)
第二行\(n\)个整数,代表时间为\(0\)时的数列
后面\(m\)行,每行若干个整数,代表一次操作
输出格式
每一个查询操作输出一行作为答案
输入输出样例
输入样例#1
10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
2 4
0 0
C 1 1 1
C 2 2 -1
Q 1 2
H 1 2 1
输出样例#1
4
55
9
15
0
1
说明
对于所有的数据有\(n,m\le 10^5,|a_i| \le 10^9\),\(|d|\le 10^4\),保证所有操作合法。
没什么可说的,就是标记永久化一下进行区间修改。
这方面的细节很多,以后需要多加注意。
Code:
#include <cstdio>
#include <cstring>
#define ll long long
const int N=1e5+10;
int ch[N*30][2],tot,root[N],n,m;
ll sum[N*30],tag[N*30],a[N];
#define ls ch[now][0]
#define rs ch[now][1]
void build(int &now,int l,int r)
{
now=++tot;
ls=rs=sum[now]=tag[now]=0;
if(l==r){sum[now]=a[l];return;}
int mid=l+r>>1;
build(ls,l,mid),build(rs,mid+1,r);
sum[now]=sum[ls]+sum[rs];
}
void change(int las,int &now,int L,int R,int l,int r,ll d)
{
now=++tot;
ls=ch[las][0],rs=ch[las][1];
if(L==l&&R==r)
{
tag[now]=tag[las]+d;
sum[now]=sum[las]+d*(R+1-L);
ls=ch[las][0],rs=ch[las][1];
return;
}
int Mid=L+R>>1;
if(r<=Mid) change(ch[las][0],ls,L,Mid,l,r,d);
else if(l>Mid) change(ch[las][1],rs,Mid+1,R,l,r,d);
else change(ch[las][0],ls,L,Mid,l,Mid,d),change(ch[las][1],rs,Mid+1,R,Mid+1,r,d);
tag[now]=tag[las];
sum[now]=sum[ls]+sum[rs]+tag[now]*(R+1-L);
}
ll query(int now,int L,int R,int l,int r)
{
if(!now||now>tot) return 0;
if(l==L&&r==R) return sum[now];
int Mid=L+R>>1;ll delta=tag[now]*(r+1-l);
if(r<=Mid) return query(ls,L,Mid,l,r)+delta;
else if(l>Mid) return query(rs,Mid+1,R,l,r)+delta;
else return query(ls,L,Mid,l,Mid)+query(rs,Mid+1,R,Mid+1,r)+delta;
}
void work()
{
tot=0;int t=0;
for(int i=1;i<=n;i++) scanf("%lld",a+i);
build(root[0],1,n);
char op[4];ll d;
for(int l,r,k,i=1;i<=m;i++)
{
scanf("%s",op);
if(op[0]=='C')
{
scanf("%d%d%lld",&l,&r,&d);++t;
change(root[t-1],root[t],1,n,l,r,d);
}
else if(op[0]=='Q'||op[0]=='H')
{
scanf("%d%d",&l,&r);
if(op[0]=='Q') k=t;
else scanf("%d",&k);
printf("%lld\n",query(root[k],1,n,l,r));
}
else
scanf("%d",&t),tot=root[t+1]-1;
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF) work();
return 0;
}
2018.12.2
HDU 4383 To The Moon 解题报告的更多相关文章
- hdu 1556.Color the ball 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 题目意思:有 n 个气球从左到右排成一排,编号依次为1,2,3,...,n.给出 n 对 a, ...
- hdu 1160 FatMouse's Speed 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 题目意思:给出一堆老鼠,假设有 n 只(输入n条信息后Ctrl+Z).每只老鼠有对应的weigh ...
- hdu 1879 继续畅通工程 解题报告
题目链接:http://code.hdu.edu.cn/showproblem.php?pid=1879 这条题目我的做法与解决Constructing Roads的解法是相同的. 0 表示没有连通: ...
- hdu 1233 还是畅通工程 解题报告
题目链接:http://code.hdu.edu.cn/showproblem.php?pid=1233 并查集的运用, 实质就是求最小生成树.先对所有的村庄距离从小到大排序,然后判断村庄之间是否属于 ...
- hdu 1213 How Many Tables 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 有关系(直接或间接均可)的人就坐在一张桌子,我们要统计的是最少需要的桌子数. 并查集的入门题,什 ...
- hdu 1272 小希的迷宫 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 第二条并查集,和畅通工程的解法类似.判断小希的迷宫不符合条件,即有回路.我的做法是,在合并两个集 ...
- hdu 1022 Train Problem I 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022 又是一道栈的练习,这次也是没有用到STL中的栈来实现.用来保存操作过程的数组(process[] ...
- hdu 1166 敌兵布阵 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目意思:给出 N 个数你,通过对某些数进行更改(或者 + 或者 -),当输入的是 Query ...
- hdu 1548 A strange lift 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 题目意思:给出 n 个 floor 你,每个floor 有一个数k,按下它可以到达 floor ...
随机推荐
- abp 关闭审计日志
在WebProject.Web.Mvc项目中的Startup文件夹下中的WebProjectWebMvcModule.cs public override void PreInitialize() { ...
- Docker--从安装到搭建环境
docker 1. ubuntu下安装docker 安装docker有两种方法: 一种是用官方的bash脚本一键安装. 直接一条命令就解决了: $ curl -sSL https://get.dock ...
- 3.5星|《哈佛商学院最受欢迎的领导课》:讲给CEO的管理学常识、常见错误和改进方法
哈佛商学院最受欢迎的领导课 英文版出版于2011年,还不算旧.中信2013年出过一版,这版估计是英文书版权过期后重新购买了再出版. 全书以写给CEO的口吻讲了许多管理常识,包含一些CEO容易犯的问题和 ...
- Spring学习(3):IOC基础(转载)
一. IoC是什么 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...
- hdu - 6282,2018CCPC湖南全国邀请赛G题,字符串,规律
HDU – 6282 http://acm.hdu.edu.cn/showproblem.php?pid=6282 by Hzu_Tested 题意:给出两个字符串S和T,只由a,b,c三种字符组成( ...
- 算法笔记(c++)--回文
算法笔记(c++)--回文 #include<iostream> #include<algorithm> #include<vector> using namesp ...
- 用 Python 构建一个极小的区块链
虽然有些人认为区块链是一个早晚会出现问题的解决方案,但是毫无疑问,这个创新技术是一个计算机技术上的奇迹.那么,究竟什么是区块链呢? 区块链 以比特币(Bitcoin)或其它加密货币按时间顺序公开地记录 ...
- JavaScript DOM编程艺术学习笔记-第二章JavaScript语法
一.JavaScript示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- java 抽象类&接口
1,抽象类中有构造函数吗? 有,用于给子类对象进行初始化. 2,抽象关键字不可以和那些关键字共存? private 不行 static 不行 final 不行 final关键字: 1,fina ...
- TCP系列45—拥塞控制—8、SACK关闭的拥塞撤销与虚假快速重传
一.概述 这篇文章介绍一下TCP从Recovery状态恢复到Open状态的时候cwnd的更新.我们在tcp重传部分的文章中曾经介绍过虚假重传的概念,Linux在探测到虚假重传的时候就会执行拥塞撤销操作 ...