码迷,mamicode.com
首页 > 其他好文 > 详细

SP1043 GSS1 - Can you answer these queries I 线段树

时间:2019-11-01 09:48:23      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:typename   using   amp   最大字段和   tchar   sp1   信息   def   temp   

问题描述

LG-SP1043


题解

GSS 系列第一题。

\(q\) 个询问,求 \([x,y]\) 的最大字段和。

线段树,维护 \([x,y]\)\(lmax,rmax,sum,val\) ,向上合并即可。

但是注意询问过程中也需要维护这些信息。


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std;

template <typename Tp>
void read(Tp &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
    if(ch=='-') ch=getchar(),fh=-1;
    else fh=1;
    while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    x*=fh;
}

const int maxn=50007;

#define lfc (x<<1)
#define rgc ((x<<1)|1)
#define mid ((l+r)>>1)
int n;
int val[maxn<<2],lf[maxn<<2],rg[maxn<<2];
int sum[maxn<<2];
int a[maxn];

void pushup(int x){
    sum[x]=sum[lfc]+sum[rgc];
    lf[x]=max(lf[lfc],sum[lfc]+lf[rgc]);
    rg[x]=max(rg[rgc],sum[rgc]+rg[lfc]);
    val[x]=max(max(val[lfc],val[rgc]),rg[lfc]+lf[rgc]);
}

void build(int x,int l,int r){
    if(l==r){
        sum[x]=val[x]=lf[x]=rg[x]=a[l];
        return;
    }
    build(lfc,l,mid);build(rgc,mid+1,r);
    pushup(x);
}

const int INF=0x3f3f3f3f;

int L,R;

struct node{
    int val,lf,rg,sum;
};

node query(int x,int l,int r){
    if(L<=l&&r<=R) return (node){val[x],lf[x],rg[x],sum[x]};
    if(L>mid) return query(rgc,mid+1,r);
    if(R<=mid) return query(lfc,l,mid);
    node res,s1=query(lfc,l,mid),s2=query(rgc,mid+1,r);
    res.sum=s1.sum+s2.sum;
    res.val=max(max(s1.val,s2.val),s1.rg+s2.lf);
    res.lf=max(s1.lf,s1.sum+s2.lf);
    res.rg=max(s2.rg,s2.sum+s1.rg);
    return res;
}

int main(){
    read(n);
    for(int i=1;i<=n;i++) read(a[i]);
    build(1,1,n);
    int T;read(T);
    while(T--){
        read(L);read(R);
        printf("%d\n",query(1,1,n).val);
    }
    return 0;
}

SP1043 GSS1 - Can you answer these queries I 线段树

标签:typename   using   amp   最大字段和   tchar   sp1   信息   def   temp   

原文地址:https://www.cnblogs.com/liubainian/p/11775114.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!