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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU - 4348To the moon——主席树+区间修改

發(fā)布時(shí)間:2023/11/30 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU - 4348To the moon——主席树+区间修改 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

HDU - 4348To the moon
【題目描述】

【題目分析】
題目中說明每次更新后時(shí)間都會(huì)加1,而且還會(huì)需要查詢以前的區(qū)間,還會(huì)需要返回以前的時(shí)間,所以是很裸的主席樹。區(qū)間查詢的話我們同樣需要用到lazy標(biāo)記
通過這道題我發(fā)現(xiàn)線段樹的操作還是很靈活的
借鑒大佬的代碼
【AC代碼】

#include<cstdio> #include<cstring> #include<algorithm>using namespace std;typedef long long ll;const int MAXN=100005; int n,m,Time; ll a[MAXN]; struct node {int ls,rs;ll sum,add; }tree[MAXN*40]; int root[MAXN*40]; int tot; void build(int &o,int l,int r) {o=++tot;tree[o].add=0;if(l==r){tree[o].sum=a[l];return;}int mid=(l+r)>>1;build(tree[o].ls,l,mid);build(tree[o].rs,mid+1,r);tree[o].sum=tree[tree[o].ls].sum+tree[tree[o].rs].sum; }void interval_add(int &x,int l,int r,int L,int R,ll z) {tree[++tot]=tree[x]; x=tot;tree[x].sum+=z*(R-L+1); //相當(dāng)于pushupif(l==L && r==R){tree[x].add+=z;return;}int mid=(l+r)>>1;if(R<=mid) interval_add(tree[x].ls,l,mid,L,R,z);//這里通過判斷讓L,R屬于l..mid,方便上面的pushupelse if(L>mid) interval_add(tree[x].rs,mid+1,r,L,R,z);else{interval_add(tree[x].ls,l,mid,L,mid,z);interval_add(tree[x].rs,mid+1,r,mid+1,R,z);} }ll query(int o,int l,int r,int L,int R) {if(l>=L && r<=R){return tree[o].sum;}ll ret=tree[o].add*(R-L+1); //pushdown,這里的pushdown沒有將標(biāo)記下傳,而是將lazy標(biāo)記保留,詢問的時(shí)候依次將路徑上的lazy標(biāo)記加起來int mid=(l+r)>>1;if(R<=mid) ret+=query(tree[o].ls,l,mid,L,R);else if(L>mid) ret+=query(tree[o].rs,mid+1,r,L,R);else{ret+=query(tree[o].ls,l,mid,L,mid);ret+=query(tree[o].rs,mid+1,r,mid+1,R);}return ret; }int main() {char cmd[5];int l,r,t;ll d;while(~scanf("%d%d",&n,&m)){for(int i=1;i<=n;i++){scanf("%lld",&a[i]);}tot=0; Time=0;build(root[0],1,n);for(int i=0;i<m;i++){scanf("%s",cmd);if(cmd[0]=='C'){scanf("%d%d%lld",&l,&r,&d);Time++;root[Time]=root[Time-1];interval_add(root[Time],1,n,l,r,d);}else if(cmd[0]=='Q'){scanf("%d%d",&l,&r);printf("%lld\n",query(root[Time],1,n,l,r));}else if(cmd[0]=='H'){scanf("%d%d%d",&l,&r,&t);printf("%lld\n",query(root[t],1,n,l,r));}else if(cmd[0]=='B'){scanf("%d",&t);Time=t;}}}return 0; }

總結(jié)

以上是生活随笔為你收集整理的HDU - 4348To the moon——主席树+区间修改的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。