求助线段树
查看原帖
求助线段树
173323
Yukinoshita_Yukino楼主2021/11/15 22:01
#include<bits/stdc++.h>
using namespace std;
const int maxn=50000+10;
int n;
int cnt[maxn];
struct Seg{
	int lmax;
	int rmax;
	int sum;
	int ans;
}tree[3*maxn];
int m;
Seg rs,ls;
void build(int k,int l,int r)
{
	if(l==r)
	{
		tree[k].sum=tree[k].lmax=tree[k].rmax=tree[k].ans=cnt[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	tree[k].sum=tree[k<<1|1].sum+tree[k<<1].sum;
	tree[k].rmax=max(tree[k<<1|1].rmax,tree[k<<1|1].sum+tree[k<<1].rmax);
	tree[k].lmax=max(tree[k<<1].lmax,tree[k<<1].sum+tree[k<<1|1].lmax);
	tree[k].ans=max(tree[k<<1].ans,max(tree[k<<1|1].ans,tree[k<<1].rmax+tree[k<<1|1].lmax));
}
Seg	ask(int k,int l,int r,int x,int y)
{
	int mid=(l+r)>>1;
	if(l<=x&&r>=y) return tree[k];
	if(x>mid) return ask(k<<1|1,mid+1,r,x,y);
	if(y<=mid) return ask(k<<1,l,mid,x,y);
	else{
		Seg ans1;
		rs=ask(k<<1,l,mid,x,y);
		ls=ask(k<<1|1,mid+1,r,x,y);
		ans1.sum=ls.sum+rs.sum;
		ans1.lmax=max(ls.lmax,ls.sum+rs.lmax);
        ans1.rmax=max(rs.rmax,rs.sum+ls.rmax);
		ans1.ans=max(ans1.ans,max(rs.ans,max(ls.ans,ls.rmax+ls.rmax)));
		return ans1;
	}
	
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>cnt[i];
	}
	build(1,1,n);
	cin>>m;
	while(m--)
	{
		int a,b;
		cin>>a>>b;
		cout<<ask(1,1,n,a,b).ans<<endl;
	}
	return 0;
 } 


不知道哪错了,感觉和题解写得一模一样...

2021/11/15 22:01
加载中...