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 ...
随机推荐
- equals和==方法比较(一)
问题描述 今天在使用spotbugs代码走查时发现这样一个问题,两个Long类型的变量使用==判断数值是否相等,spotbugs提示这是一个很致命的错误,代码大概如下, Long l1=123l; L ...
- Appium+python 自动发送邮件(2)(转)
(原文:https://www.cnblogs.com/fancy0158/p/10056418.html) 移动端执行完测试case之后,通过邮件自动发送测试报告.大体流程如下: 1.通过unitt ...
- java计算工龄
计算工龄原则:若是2000-10-12作为开始工作时间,则到下一年的2001-10-13算为一年.有个bug,不满一年的工龄是错误的. import java.util.Date;import jav ...
- [C++基础] tips
1. 在g++ 中使支持C++11 https://askubuntu.com/questions/773283/how-do-i-use-c11-with-g This you can do by ...
- Tensorflow - Implement for a Softmax Regression Model on MNIST.
Coding according to TensorFlow 官方文档中文版 import tensorflow as tf from tensorflow.examples.tutorials.mn ...
- gulp4.0 存在的错误信息 The following tasks did not complete: default,Did you forget to signal async completion?
当gulp为如下代码的时候: // 以下代码会执行在node环境下 const gulp = require( "gulp" ); // 创建一个gulp的任务 gulp.task ...
- linux下svn操作(专)
原文地址:https://www.cnblogs.com/clicli/p/5913330.html svn命令在linux下的使用SVN软件版本管理 1.将文件checkout到本地目录svn ch ...
- 随机生成30道四则运算题NEW
代码: #include <iostream> #include <time.h> using namespace std; void main() { srand((int) ...
- DP---(POJ1159 POJ1458 POJ1141)
POJ1159,动态规划经典题目,很适合初学者入门练手. 求:为了使字符串左右对称,应该插入的最小字符数目. 设字符串为S1 S2 S3 - Sn. 这个字符串有n个字符,根据DP的基本思路,减少问题 ...
- CentOS7实现RabbitMQ高可用集群
CentOS安装RabbitMQ集群 1.有3台已安装RabbitMQ的机器 192.168.38.133 rabbitmq1 192.168.38.137 rabbitmq2 192.168.38. ...