球球扳交orz
查看原帖
球球扳交orz
730717
wanwang楼主2024/5/4 10:28

没有spoj的账号求dalao帮交一下0^0

#include<bits/stdc++.h>
#define lot long
using namespace std;
const int N=5e5+10;
struct st{
	int l,r;
	int sum,lmax,rmax,data;
}t[N<<2];
int a[N];
inline int read(){
	int XX=0,FF=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')
			FF*=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		XX=XX*10+ch-48;
		ch=getchar();
	}
	return XX*FF;
}
inline void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9)
		write(x/10);
	putchar(x%10+'0');
	return ;
}
void push_up(st &u,st &l,st &r){
	u.sum=l.sum+r.sum;
	u.lmax=max(l.lmax,l.sum+r.lmax);
	u.rmax=max(r.rmax,r.sum+l.rmax);
	u.data=max(max(l.data,r.data),l.rmax+r.lmax);
	return ;
}
void push_up(int rt){
	push_up(t[rt],t[rt<<1],t[rt<<1|1]);
}
void build(int rt,int l,int r){
	t[rt].l=l;
	t[rt].r=r;
	if(l==r){
		t[rt]={l,r,a[r],a[r],a[r],a[r]};
		return ;
	}
	int mid=(l+r)>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	push_up(rt);
	return ;
}
st ask(int rt,int l,int r){
	if(t[rt].l>=l&&t[rt].r<=r){
		return t[rt];
	}
	int mid=(t[rt].l+t[rt].r)>>1;
	if(r<=mid)return ask(rt<<1,l,r);
	else if(l>mid)return ask(rt<<1|1,l,r);
	else{
		st lans=ask(rt<<1,l,r),rans=ask(rt<<1|1,l,r),ans;	
		push_up(ans,lans,rans);
		return ans;
	}
}
int n,m;
int main(){
	n=read();
	for(int i=1;i<=n;i++)a[i]=read();
	build(1,1,n);
	m=read();
	while(m--){
		int x=read(),y=read();
		if(x>y)swap(x,y);
		write(ask(1,x,y).data);
		printf("\n");
	}
	return 0;
}
2024/5/4 10:28
加载中...