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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Can you answer these queries I SPOJ - GSS1 (线段树维护区间连续最大值/最大连续子段和)...

發(fā)布時(shí)間:2023/12/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Can you answer these queries I SPOJ - GSS1 (线段树维护区间连续最大值/最大连续子段和)... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

You are given a sequence A[1], A[2], ..., A[N] . ( |A[i]| ≤ 15007 , 1 ≤ N ≤ 50000 ). A query is defined as follows:
Query(x,y) = Max { a[i]+a[i+1]+...+a[j] ; x ≤ i ≤ j ≤ y }.
Given M queries, your program must output the results of these queries.

Input
The first line of the input file contains the integer N.
In the second line, N numbers follow.
The third line contains the integer M.
M lines follow, where line i contains 2 numbers xi and yi.
Output
Your program should output the results of the M queries, one query per line.

Sample Input
3
-1 2 3
1
1 2
Sample Output
2

題意:

裸題,沒有更新,只有查詢。


思路:

區(qū)間中維護(hù)一下值:

從左端點(diǎn)開始的連續(xù)的最大值lm

從右端點(diǎn)開始的連續(xù)最大值rm

區(qū)間的和sum。

區(qū)間中的連續(xù)最大值num。

那么更新操作為:

lm=max(左兒子的lm,左兒子的sum+右兒子的lm)

rm=max(右兒子的rm,右兒子的sum+左兒子的rm)

num=max(左兒子的num,右兒子的num,左兒子的rm+右兒子的lm)

詢問操作也返回區(qū)間,對(duì)區(qū)間進(jìn)行合并處理操作。

細(xì)節(jié)見代碼:

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #include <vector> #include <iomanip> #define ALL(x) (x).begin(), (x).end() #define sz(a) int(a.size()) #define all(a) a.begin(), a.end() #define rep(i,x,n) for(int i=x;i<n;i++) #define repd(i,x,n) for(int i=x;i<=n;i++) #define pii pair<int,int> #define pll pair<long long ,long long> #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define MS0(X) memset((X), 0, sizeof((X))) #define MSC0(X) memset((X), '\0', sizeof((X))) #define pb push_back #define mp make_pair #define fi first #define se second #define eps 1e-6 #define gg(x) getInt(&x) #define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl using namespace std; typedef long long ll; ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;} ll lcm(ll a, ll b) {return a / gcd(a, b) * b;} ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;} inline void getInt(int* p); const int maxn = 50000+7; const int inf = 0x3f3f3f3f; /*** TEMPLATE CODE * * STARTS HERE ***/ struct node {int l;int r;ll num;ll lm;ll sum;ll rm; }segment_tree[maxn<<2]; int n; void pushup(int rt) {segment_tree[rt].sum=segment_tree[rt<<1].sum+segment_tree[rt<<1|1].sum;segment_tree[rt].lm=max(segment_tree[rt<<1].lm,segment_tree[rt<<1].sum+segment_tree[rt<<1|1].lm);segment_tree[rt].rm=max(segment_tree[rt<<1|1].rm,segment_tree[rt<<1|1].sum+segment_tree[rt<<1].rm);segment_tree[rt].num=max(segment_tree[rt<<1].num,segment_tree[rt<<1|1].num);segment_tree[rt].num=max(segment_tree[rt].num,segment_tree[rt<<1].rm+segment_tree[rt<<1|1].lm); }void build(int rt,int l,int r) {segment_tree[rt].l=l;segment_tree[rt].r=r;if(l==r){scanf("%lld",&segment_tree[rt].num);segment_tree[rt].lm=segment_tree[rt].rm=segment_tree[rt].num;segment_tree[rt].sum=segment_tree[rt].num;return ;}int mid=(l+r)>>1;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);pushup(rt); }node ask(int rt,int l,int r) {if(segment_tree[rt].l==l&&segment_tree[rt].r==r){return segment_tree[rt];}int mid=(segment_tree[rt].r+segment_tree[rt].l)>>1;if(l>mid){return ask(rt<<1|1,l,r);}else if(r<=mid){return ask(rt<<1,l,r);}else{node res1=ask(rt<<1,l,mid);node res2=ask(rt<<1|1,mid+1,r);node res;res.sum=res1.sum+res2.sum;res.lm=max(res1.lm,res1.sum+res2.lm);res.rm=max(res2.rm,res2.sum+res1.rm);res.num=max(res1.num,res2.num);res.num=max(res.num,res1.rm+res2.lm);return res;} }int main() {//freopen("D:\\code\\text\\input.txt","r",stdin);//freopen("D:\\code\\text\\output.txt","w",stdout);scanf("%d",&n);build(1,1,n);int m;scanf("%d",&m);while(m--){int x,y;scanf("%d %d",&x,&y);printf("%lld\n",ask(1,x,y).num);}return 0; }inline void getInt(int* p) {char ch;do {ch = getchar();} while (ch == ' ' || ch == '\n');if (ch == '-') {*p = -(getchar() - '0');while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 - ch + '0';}}else {*p = ch - '0';while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 + ch - '0';}} }

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

總結(jié)

以上是生活随笔為你收集整理的Can you answer these queries I SPOJ - GSS1 (线段树维护区间连续最大值/最大连续子段和)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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