SPOJ GSS1 Can you answer these queries I
Posted SilverNebula
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPOJ GSS1 Can you answer these queries I相关的知识,希望对你有一定的参考价值。
Time Limit: 115MS | Memory Limit: 1572864KB | 64bit IO Format: %lld & %llu |
Description
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.
Example
Input:
3
-1 2 3
1
1 2
Output:
2
Hint
Added by: | Nguyen Dinh Tu |
Date: | 2006-11-01 |
Time limit: | 0.115s-0.230s |
Source limit: | 5000B |
Memory limit: | 1536MB |
Cluster: | Cube (Intel G860) |
Languages: | All except: ERL JS NODEJS PERL 6 VB.net |
询问区间内和最大的连续子序列。没有修改操作。
线段树维护即可。
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #define lc rt<<1 8 #define rc rt<<1|1 9 using namespace std; 10 const int mxn=100010; 11 int read(){ 12 int x=0,f=1;char ch=getchar(); 13 while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} 14 while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 15 return x*f; 16 } 17 int n,m; 18 int data[mxn]; 19 struct node{ 20 int mx; 21 int ml,mr; 22 int smm; 23 }t[mxn<<2],tmp0; 24 void Build(int l,int r,int rt){ 25 if(l==r){t[rt].mx=t[rt].ml=t[rt].mr=data[l];t[rt].smm=data[l];return;} 26 int mid=(l+r)>>1; 27 Build(l,mid,lc); 28 Build(mid+1,r,rc); 29 t[rt].smm=t[lc].smm+t[rc].smm; 30 t[rt].mx=max(t[lc].mx,t[rc].mx); 31 t[rt].mx=max(t[lc].mr+t[rc].ml,t[rt].mx); 32 t[rt].ml=max(t[lc].ml,t[lc].smm+t[rc].ml); 33 t[rt].mr=max(t[rc].mr,t[rc].smm+t[lc].mr); 34 return; 35 } 36 node query(int L,int R,int l,int r,int rt){ 37 // printf("%d %d %d %d %d\n",L,R,l,r,rt); 38 if(L<=l && r<=R){return t[rt];} 39 int mid=(l+r)>>1; 40 node res1; 41 if(L<=mid)res1=query(L,R,l,mid,lc); 42 else res1=tmp0; 43 node res2; 44 if(R>mid)res2=query(L,R,mid+1,r,rc); 45 else res2=tmp0; 46 node res={0}; 47 res.smm=res1.smm+res2.smm; 48 res.mx=max(res1.mx,res2.mx); 49 res.mx=max(res.mx,res1.mr+res2.ml); 50 res.ml=max(res1.ml,res1.smm+res2.ml); 51 res.mr=max(res2.mr,res2.smm+res1.mr); 52 return res; 53 } 54 int main(){ 55 n=read(); 56 int i,j,x,y; 57 for(i=1;i<=n;i++)data[i]=read(); 58 Build(1,n,1); 59 m=read(); 60 tmp0.ml=tmp0.mr=tmp0.mx=-1e9;tmp0.smm=0; 61 for(i=1;i<=m;i++){ 62 x=read();y=read(); 63 printf("%d\n",query(x,y,1,n,1).mx); 64 } 65 return 0; 66 }
以上是关于SPOJ GSS1 Can you answer these queries I的主要内容,如果未能解决你的问题,请参考以下文章
Can you answer these queries I SPOJ - GSS1 (线段树维护区间连续最大值/最大连续子段和)
SPOJ GSS3 Can you answer these queries III ——线段树
SPOJ GSS5 Can you answer these queries V ——线段树
SPOJ1557 GSS2 Can you answer these queries II 线段树