日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 4383 To The Moon 解题报告

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 42 4 0 0 C 1 1 1 C 2 2 -1 Q 1 2 H 1 2 1

輸出樣例#1

4 55 9 150 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));}elsescanf("%d",&t),tot=root[t+1]-1;} } int main() {while(scanf("%d%d",&n,&m)!=EOF) work();return 0; }

2018.12.2

轉載于:https://www.cnblogs.com/butterflydew/p/10055576.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的HDU 4383 To The Moon 解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。