SPOJ GSS1 Can you answer these queries I ——线段树
【题目分析】
线段树裸题。
注意update的操作,写结构体里好方便。
嗯,没了。
【代码】
#include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <map> #include <set> #include <queue> #include <string> #include <iostream> #include <algorithm> using namespace std; #define maxn 500005 #define eps 1e-8 #define db double #define ll long long #define inf 0x3f3f3f3f #define F(i,j,k) for (int i=j;i<=k;++i) #define D(i,j,k) for (int i=j;i>=k;--i) void Finout() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); #endif } int Getint() { int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();} while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f; } struct Node{ int lx,rx,mx,sum; Node operator + (Node x) { Node ret; ret.lx=max(lx,sum+x.lx); ret.rx=max(x.sum+rx,x.rx); ret.sum=sum+x.sum; ret.mx=max(max(mx,x.mx),max(rx+x.lx,max(ret.lx,ret.rx))); return ret; } }t[maxn]; int n,a[maxn],q,L,R; void Build(int o,int l,int r) { // printf("Build %d %d\n",l,r); if (l==r) { t[o].lx=t[o].rx=t[o].mx=t[o].sum=a[l]; return ; } int mid=l+r>>1; Build(o<<1,l,mid); Build(o<<1|1,mid+1,r); t[o]=t[o<<1]+t[o<<1|1]; } Node Query(int o,int l,int r) { // printf("Query %d %d\n",l,r); if (L<=l&&r<=R) return t[o]; int mid=l+r>>1; if (L>mid) return Query(o<<1|1,mid+1,r); else if (R<=mid) return Query(o<<1,l,mid); else return Query(o<<1,l,mid)+Query(o<<1|1,mid+1,r); } int main() { Finout(); n=Getint(); F(i,1,n) a[i]=Getint(); Build(1,1,n); q=Getint(); F(i,1,q) { L=Getint(); R=Getint(); printf("%d\n",Query(1,1,n).mx); } }