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 ...
随机推荐
- Matplotlib API汉化
Pyplot API 示例汇总:https://matplotlib.org/gallery/index.html#api-examples 该matplotlib.pyplot模块包含的功能允许您快 ...
- 你的第一个接口测试:Python 接口测试
前言: 首先我们先明确一个概念,什么叫接口.什么叫接口测试? 接口的全称叫[Application Programming Interface 又叫API],是提供应用程序与开发人员基于某软件或硬件得 ...
- 常用SQL语句大全(SQL Server)
一.基础 查看数据库状态 select state_desc from sys.databases where name='dbname' -- dbname数据库名 1.说明:创建数据 ...
- [转]git命令之git remote的用法
git remote git remote -v git init git add xxx git commit -m 'xxx' git remote add origin ssh://softw ...
- Python解包参数列表及 Lambda 表达式
解包参数列表 当参数已经在python列表或元组中但需要为需要单独位置参数的函数调用解包时,会发生相反的情况.例如,内置的 range() 函数需要单独的 start 和 stop 参数.如果它们不能 ...
- android 签名相关
查看keystorekeytool -list -v -keystore debug.keystoreapk签名不带别名 apksigner sign --ks debug.keystore test ...
- Linux建立互信关系(ssh公钥登录)
Linux有多种登录方式,比如telnet.ssh.支持ssh登录方式:口令登录和公钥登录 ssh登录方式:ssh [-l login_name] [-p port] [user@]hostname ...
- Python 日志记录与程序流追踪(基础篇)
日志记录(Logging) More than print: 每次用 terminal debug 时都要手动在各种可能出现 bug 的地方 print 相关信息来确认 bug 的位置: 每次完成 d ...
- [T-ARA][너 때문에 미쳐][因为你而疯了]
歌词来源:http://music.163.com/#/song?id=5402880 作曲 : 赵英秀/김태현 [作曲 : 赵英秀/k/gim-Tae-hyeon] 作词 : 辉星 [作词 : 辉星 ...
- 手动配置网卡配置文件ifcfg-eth0
linux 其他知识目录 原文链接:https://www.cnblogs.com/arvintang/p/5990599.html 网络接口配置文件[root@localhost ~]# cat / ...