求助提交
查看原帖
求助提交
948963
wzh041500楼主2024/3/19 20:10

悬关

哪位dalao绑定了个人账户,帮本蒟蒻提交一下,不胜感激。

//轻喷

#include<bits/stdc++.h>
using namespace std;
const int N=5e4+10;
int a[N],n,m,xx,yy;
struct node{
	int l,r,num/*总和*/,mxmn/*最大子权和*/,bknm/*最大后缀和*/,frtnm/*最大前缀和*/;
}tree[4*N];
struct node2{
	int num/*总和*/,mxmn/*最大子权和*/,bknm/*最大后缀和*/,frtnm/*最大前缀和*/;
};
void pushup(int k){
	tree[k].num=tree[k*2].num+tree[k*2+1].num;
	tree[k].bknm=max(tree[k*2+1].bknm,tree[k*2+1].num+tree[k*2].bknm);
	tree[k].frtnm=max(tree[k*2].frtnm,tree[k*2].num+tree[k*2+1].frtnm);
	tree[k].mxmn=max(tree[k*2].mxmn,max(tree[k*2+1].mxmn,tree[k*2].bknm+tree[k*2+1].frtnm));
}
void build(int k,int l,int r){
	tree[k].l=l;
	tree[k].r=r;
	if(l==r){
		tree[k].num=a[l];
		int o=max(0,a[l]);
		tree[k].mxmn=o;
		tree[k].frtnm=o;
		tree[k].bknm=o;
		return;
	}
	int mid=(l+r)/2;
	build(k*2,l,mid);//left_tree
	build(k*2+1,mid+1,r);//ringt_tree
	pushup(k);
}
node2 workdata(node2 x,node2 y){
	node2 g;
	g.num=x.num+y.num;
	g.bknm=max(y.bknm,y.num+y.bknm);
	g.frtnm=max(x.frtnm,x.num+y.frtnm);
	g.mxmn=max(x.mxmn,max(y.mxmn,x.bknm+y.frtnm));
	return g;
}
node2 query(int k,int l,int r){
	if(l<=tree[k].l&&tree[k].r<=r){
		node2 g;
		g.bknm=tree[k].bknm;
		g.num=tree[k].num;
		g.frtnm=tree[k].frtnm;
		g.mxmn=tree[k].mxmn;
		return g;
	}
	int mid=(tree[k].l+tree[k].r)/2;
	node2 rtnl,rtnr;
	bool qsl=0,qsr=0;
	if(l<=mid){
		qsl=1;
		rtnl=query(k*2,l,r);
	}
	//left
	if(mid+1<=r){
		qsr=1;
		rtnr=query(k*2+1,l,r);
	}
	//right
	if(qsr==0)return rtnl;
	if(qsl==0)return rtnr;
	return workdata(rtnl,rtnr);
} 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>xx>>yy;
		node2 g=query(1,xx,yy);
		cout<<g.mxmn<<endl;
	}
	return 0;
} 
2024/3/19 20:10
加载中...