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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

codevs 3981 动态最大子段和(线段树)

發(fā)布時間:2025/7/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 codevs 3981 动态最大子段和(线段树) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目傳送門:codevs 3981 動態(tài)最大子段和?

?

題目描述?Description

題目還是簡單一點好...?

有n個數(shù),a[1]到a[n]。

接下來q次查詢,每次動態(tài)指定兩個數(shù)l,r,求a[l]到a[r]的最大子段和。

子段的意思是連續(xù)非空區(qū)間。

輸入描述?Input Description

第一行一個數(shù)n。

第二行n個數(shù)a[1]~a[n]。

第三行一個數(shù)q。

以下q行每行兩個數(shù)l和r。

輸出描述?Output Description

q行,每行一個數(shù),表示a[l]到a[r]的最大子段和。

樣例輸入?Sample Input

7
2 3 -233 233 -23 -2 233
4
1 7
5 6
2 5
2 3

樣例輸出?Sample Output

441
-2
233
3

數(shù)據(jù)范圍及提示?Data Size & Hint

對于50%的數(shù)據(jù),q*n<=10000000。

對于100%的數(shù)據(jù),1<=n<=200000,1<=q<=200000。

a[1]~a[n]在int范圍內(nèi),但是答案可能超出int范圍。

數(shù)據(jù)保證1<=l<=r<=n。

空間128M,時間1s。

?

題目大意:

  求解區(qū)間 a[l]~a[r] 的最大子段和

?

解題思路:

  用線段樹維護區(qū)間最大值。開幾個變量存區(qū)間和sum,完全在左區(qū)間的最大值max_l,完全在右區(qū)間的最大值max_r,跨左右區(qū)間的最大值max。

?

1 #include <bits/stdc++.h> 2 #define lson rt<<1,l,mid 3 #define rson rt<<1|1,mid+1,r 4 using namespace std; 5 const int N = 200000 + 10; 6 typedef long long int ll; 7 struct node 8 { 9 int l,r; 10 ll max_,max_l,max_r,sum; 11 } a[N<<2]; 12 int n,q,x,y; 13 ll ans; 14 void up(int rt) 15 { 16 a[rt].max_=max(max(a[rt<<1].max_,a[rt<<1|1].max_),a[rt<<1].max_r+a[rt<<1|1].max_l); 17 a[rt].max_l=max(a[rt<<1].max_l,a[rt<<1].sum+a[rt<<1|1].max_l); 18 a[rt].max_r=max(a[rt<<1|1].max_r,a[rt<<1|1].sum+a[rt<<1].max_r); 19 a[rt].sum=a[rt<<1].sum+a[rt<<1|1].sum; 20 } 21 void build(int rt,int l,int r) 22 { 23 a[rt].l=l,a[rt].r=r; 24 if (l==r) 25 { 26 scanf("%lld",&a[rt].max_); 27 a[rt].max_l=a[rt].max_r=a[rt].sum=a[rt].max_; 28 return ; 29 } 30 int mid = (l+r)>>1; 31 build(lson); 32 build(rson); 33 up(rt); 34 } 35 void query(int rt,int L,int R,ll &ans,ll &ansl,ll &ansr) 36 { 37 if (L<=a[rt].l&&a[rt].r<=R) 38 { 39 ans=a[rt].max_; 40 ansl=a[rt].max_l; 41 ansr=a[rt].max_r; 42 return ; 43 } 44 int mid=(a[rt].l+a[rt].r)>>1; 45 if (mid>=R) query(rt<<1,L,R,ans,ansl,ansr); 46 else if (mid<L) query(rt<<1|1,L,R,ans,ansl,ansr); 47 else 48 { 49 ll lans=0,lansl=0,lansr=0,rans=0,ransl=0,ransr=0; 50 query(rt<<1,L,R,lans,lansl,lansr); 51 query(rt<<1|1,L,R,rans,ransl,ransr); 52 ans=max(max(lans,rans),lansr+ransl); 53 ansl=max(lansl,ransl+a[rt<<1].sum); 54 ansr=max(ransr,lansr+a[rt<<1|1].sum); 55 } 56 } 57 int main() 58 { 59 scanf("%d",&n); 60 build(1,1,n); 61 for ( scanf("%d",&q); q; q--) 62 { 63 scanf("%d%d",&x,&y); 64 ll ans=0,ansl=0,ansr=0; 65 query(1,x,y,ans,ansl,ansr); 66 printf("%lld\n",ans); 67 } 68 return 0; 69 } View Code

?

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

總結(jié)

以上是生活随笔為你收集整理的codevs 3981 动态最大子段和(线段树)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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