哪位有SPOJ账号的大佬能帮我评测一下这道题?谢谢!
查看原帖
哪位有SPOJ账号的大佬能帮我评测一下这道题?谢谢!
760000
I0I_AK_ME楼主2022/7/27 09:32

如题

#include <iostream>
using namespace std;
int n,q,a[500010];
struct dot{
    int l,r;
    int sum,lmax,rmax;
	int dat;
};
dot t[500010*4];
void build(int p, int l, int r){
    t[p].l=l, t[p].r=r;
    if(l==r){
        t[p].sum=a[l];
		t[p].lmax=a[l];
		t[p].rmax=a[l]; 
		t[p].dat=a[l];
        return ;
    }
    int mid=(l+r)/2;
    build(p*2,l,mid);
	build(p*2+1,mid+1,r);
    t[p].sum=t[p*2].sum+t[p*2+1].sum;
    t[p].lmax=max(t[p*2].lmax,t[p*2].sum+t[p*2+1].lmax);
    t[p].rmax=max(t[p*2+1].rmax,t[p*2+1].sum+t[p*2].rmax);
    t[p].dat=max(t[p*2].dat,max(t[p*2+1].dat,t[p*2].rmax+t[p*2+1].lmax));
}

int Lmax(int p, int R){
    int l=t[p].l;
	int r=t[p].r;
	int mid=(l+r)/2;
    if(R==r) return t[p].lmax;
    if(R<=mid) return Lmax(p*2,R);
    return max(t[p*2].sum+Lmax(p*2+1,R), Lmax(p*2,mid));
}

int Rmax(int p, int L){
    int l=t[p].l;
	int r=t[p].r;
	int mid=(l+r)/2;
    if(L==l) return t[p].rmax;
    if(mid+1<=L) return Rmax(p*2+1,L);
    return max(t[p*2+1].sum+Rmax(p*2,L), Rmax(p*2+1,mid+1));
}

int getmax(int p,int L,int R){
    int l=t[p].l;
	int r=t[p].r;
	int mid=(l+r)/2;
    if(L==l&&R==r) return t[p].dat;
    if(l<=L&&R<=mid) return getmax(p*2,L,R);
    if(mid+1<=L&&R<=r) return getmax(p*2+1,L,R);
    return max(Rmax(p*2, L)+Lmax(p*2+1, R),max(getmax(p*2,L,mid),getmax(p*2+1,mid+1,R)));
}

void add(int p,int x,int k){
    int l=t[p].l;
	int r=t[p].r;
	int mid=(l+r)/2;
    if(l==r)
    {
        t[p].sum=k;
		t[p].lmax=k;
		t[p].rmax=k;
		t[p].dat=k;
        return;
    }
    if(x<=mid)
	    add(p*2,x,k);
    else add(p*2+1,x,k);
    t[p].sum=t[p*2].sum+t[p*2+1].sum;
    t[p].lmax=max(t[p*2].lmax,t[p*2].sum+t[p*2+1].lmax);
    t[p].rmax=max(t[p*2+1].rmax,t[p*2+1].sum+t[p*2].rmax);
    t[p].dat=max(t[p*2].dat,max(t[p*2+1].dat,t[p*2].rmax+t[p*2+1].lmax));
}

int main(){
	cin>>n;
    for(int i=1; i<=n; i++)
    	cin>>a[i];
    build(1, 1, n);
    cin>>q;
    while(q--){
        int op, x, y;
        cin>>op>>x>>y;
        if(k==1) cout<<getmax(1,x,y);
        else add(1,x,y);
    }
}
2022/7/27 09:32
加载中...