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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

SPOJ GSS2 Can you answer these queries II (线段树离线) - xgtao -

發(fā)布時(shí)間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SPOJ GSS2 Can you answer these queries II (线段树离线) - xgtao - 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Can you answer these queries II

?

這是一道線(xiàn)段樹(shù)的題目,維護(hù)歷史版本,給出N(<=100000)個(gè)數(shù)字(-100000<=x<=100000),要求求出在[l,r]區(qū)間里面的連續(xù)序列的最大值,并且重復(fù)的數(shù)字可以加入序列但是值不能再計(jì)算。

?

本題明顯使用線(xiàn)段樹(shù),它只存在詢(xún)問(wèn)而沒(méi)有修改操作,離線(xiàn)相對(duì)于在線(xiàn)更好維護(hù)。

定義s[i] = ai + ai+1 + ai+2 + ... an,以ai開(kāi)頭的數(shù)列的和,那么每次加入更新ai 那么s1,s2,...si都會(huì)相應(yīng)的加一個(gè)ai,s[1~i]中出現(xiàn)過(guò)a[i]是不能重復(fù)加值的,那么為了避免重復(fù)加值,用pre[a[i]]表示a[i]上一次出現(xiàn)的位置,那么也就是s[pre[ai]+1]~s[i]這一個(gè)區(qū)間加上a[i],每一次更新a[i]都要記錄歷史版本的最大值和懶惰標(biāo)記的最大值。

?

#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std;const int N = 100010; const int M = 100010; const int C = 100001; long long res[N]; int a[N],pre[N<<1],n,m;struct Que{int l,r,ID;bool operator < (const Que &rhs)const{return r < rhs.r;} }question[M];struct Tree{long long s,ms,d,md;}tree[N<<2];#define lson k<<1,l,mid #define rson k<<1|1,mid+1,rvoid processup(int k){tree[k].s = max(tree[k<<1].s,tree[k<<1|1].s);tree[k].ms = max(tree[k<<1].ms,tree[k<<1|1].ms); }void processdown(int k){if(!tree[k].d && !tree[k].md)return;tree[k<<1].ms = max(tree[k<<1].ms,tree[k<<1].s+tree[k].md);tree[k<<1].md = max(tree[k<<1].md,tree[k<<1].d+tree[k].md);tree[k<<1].s += tree[k].d,tree[k<<1].d += tree[k].d;tree[k<<1|1].ms = max(tree[k<<1|1].ms,tree[k<<1|1].s+tree[k].md);tree[k<<1|1].md = max(tree[k<<1|1].md,tree[k<<1|1].d+tree[k].md);tree[k<<1|1].s += tree[k].d,tree[k<<1|1].d += tree[k].d;tree[k].d = tree[k].md = 0; }long long query(int k,int l,int r,int xl,int xr){if(l == xl && r == xr)return tree[k].ms;processdown(k);int mid = (l+r)>>1;if(xr <= mid)return query(lson,xl,xr);else if(xl > mid)return query(rson,xl,xr);else return max(query(lson,xl,mid),query(rson,mid+1,xr));processup(k); }void update(int k,int l,int r,int xl,int xr,long long x){if(l == xl && r == xr){tree[k].s += x;tree[k].d += x;tree[k].ms = max(tree[k].ms,tree[k].s);tree[k].md = max(tree[k].md,tree[k].d);return;}processdown(k);int mid = (l+r)>>1;if(xr <= mid)update(lson,xl,xr,x);else if(xl > mid)update(rson,xl,xr,x);else update(lson,xl,mid,x),update(rson,mid+1,xr,x);processup(k); }#define clr(a,b) memset(a,b,sizeof(a))int main(){while(scanf("%d",&n) == 1){clr(tree,0),clr(pre,0);for(int i = 1;i <= n;++i)scanf("%d",&a[i]);scanf("%d",&m);for(int i = 1;i <= m;++i){scanf("%d%d",&question[i].l,&question[i].r);question[i].ID = i;}sort(question+1,question+m+1);int ID = 1;for(int i = 1;i <= n;++i){update(1,1,n,pre[a[i]+C]+1,i,a[i]);pre[a[i]+C] = i;while(ID <= m && question[ID].r == i){res[question[ID].ID] = query(1,1,n,question[ID].l,question[ID].r);ID++;}}for(int i = 1;i <= m;++i)printf("%lld\n",res[i]);}return 0; }

  

  

轉(zhuǎn)載于:https://www.cnblogs.com/xgtao984/p/5721033.html

總結(jié)

以上是生活随笔為你收集整理的SPOJ GSS2 Can you answer these queries II (线段树离线) - xgtao -的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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