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 ...
随机推荐
- CentOS-6.4 minimal - 安装VMware Tools(linux)
本文参考自:http://www.cnblogs.com/xyq/p/4068018.html 1.挂载光驱 2./mnt下面默认显示以下文件 3.卸载/mnt 4.点击安装VMware Tools ...
- mac生成ssh公私匙
1. cd ~/.ssh/ 2.ssh-keygen 3.id_rsa.pub文件放入git 4.私匙放进jenkins
- JS_正则表达式_验证中文字符
正则表达式:"^[\u4e00-\u9fa5]{0,}$" . "/^[\u4E00-\u9FA5]{1,5}$/" 的含义: 在JS里,\uXXXX 是转义字 ...
- python-__getattr__ 和 __getattribute__
python3完全使用了新式类,废弃了旧式类,getattribute作为新式类的一个特性有非常奇妙的作用.查看一些博客和文章后,发现想要彻底理解getattr和getattribute的区别,实际上 ...
- 局域网安全-MAC Flood/Spoof
原文发表于:2010-09-22 转载至cu于:2012-07-21 很早之前就看过秦柯讲的局域网安全的视频.但是看了之后在实际工作当中很少用到(指我个人的工作环境中,惭愧啊…),时间长了,好多技术细 ...
- 洛谷【P1057】传球游戏
https://www.luogu.org/problemnew/show/P1057 题目描述 在体育课上, 老师带着同学们一起做传球游戏. 游戏规则是这样的: n 个同学站成一个圆圈, 其中的一个 ...
- Spark Streaming的使用——转载
转载自 Spark Streaming 使用
- linux 性能分析命令及其解释
很多时候,我们需要对linux上运行的环境大体有一个了解,那么久需要大体知道当前系统的相关资源的使用情况,那么可以用一些linux提供的丰富的命令来查看 性能分析 vmstat 虚拟内存统计 用法 U ...
- redis rdb aof比较
Redis中数据存储模式有2种:cache-only,persistence; cache-only即只做为“缓存”服务,不持久数据,数据在服务终止后将消失,此模式下也将不存在“数据恢复”的手段,是一 ...
- Manacher算法——求最长回文子串
首先,得先了解什么是回文串.回文串就是正反读起来就是一样的,如“abcdcba”.我们要是直接采用暴力方法来查找最长回文子串,时间复杂度为O(n^3),好一点的方法是枚举每一个字符,比较较它左右距离相 ...