代码求调(悬关)
查看原帖
代码求调(悬关)
574921
Dress楼主2024/5/11 17:38
#include<bits/stdc++.h>
#define N 100010
using namespace std;
typedef long long ll;
struct node{
	ll l,r;
	ll maxn,maxl,maxr,sum;
}t[4*N];
ll n,m,a[50005];
void pushup(ll u){
	t[u].sum=t[u<<1].sum+t[u<<1|1].sum;
    t[u].maxl=max(t[u<<1].maxl,t[u<<1].sum+t[u<<1|1].maxl);
    t[u].maxr=max(t[u<<1|1].maxr,t[u<<1|1].sum+t[u<<1].maxr);
	t[u].maxn=max(max(t[u<<1].maxn,t[u<<1|1].maxn),t[u<<1].maxr+t[u<<1|1].maxl);
}
void build(ll p,ll l,ll r){
	t[p].l=l;t[p].r=r;
	if(l==r){	
	t[p].maxn=a[l];t[p].maxl=a[l];
	t[p].maxr=a[l];t[p].sum=a[l]; 
	return ;
	}
	ll mid=(l+r)>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	pushup(p);
} 
node ask(ll p,ll l,ll r){
	if(t[p].l<=l&&t[p].r>=r){
		return t[p];
	}
	ll mid=(l+r)>>1;
	if(r<=mid) return ask(p<<1,mid+1,t[p].r);
    if(l>mid) return ask(p<<1|1,t[p].l,mid);
	node s ,tl=ask(p<<1,t[p].l,mid ),tr=ask(p<<1|1,mid+1,t[p].r);
	s.sum=tl.sum+tr.sum;
    s.maxl=max(tl.maxl,tl.sum+tr.maxl);
   	s.maxr=max(tr.maxr,tr.sum+tl.maxr);
	s.maxn=max(max(tl.maxn,tr.maxn),tl.maxr+tr.maxl);
	return s;
}
int main(){
	cin >> n ;
	for(ll i=1;i<=n;i++){
		cin >>a[i] ;
	}
	cin >> m ;
	ll x,y;
	build(1,1,n);
	while(m--){
		cin >> x >> y ;
			cout<<ask(1,x,y).maxn<<endl;
	}
	return 0; 
} 

谢谢dalao

2024/5/11 17:38
加载中...