求助
查看原帖
求助
251779
Beep_Monkey楼主2022/2/12 18:29
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>PP;
typedef long long LL;
const int maxn=500000;
PP maxsum[maxn*4];
int maxpre[maxn*4],maxsuf[maxn*4],a[maxn],x,y;
LL sum[maxn];
LL getsum(int x,int y){
	return sum[y]-sum[x-1];
} 
LL getsum(PP x){
	return getsum(x.first,x.second);
} 
PP better(PP x,PP y){
	if(getsum(x)==getsum(y)) return x<y?x:y;
	else return getsum(x)<getsum(y)?y:x;
}
void build(int o,int L,int R){
	if(L==R){
		maxpre[o]=maxsuf[o]=L;
		maxsum[o]=make_pair(L,L);
		return ;
	}
	int M=(L+R)/2;
	build(o*2,L,M);
	build(o*2+1,M+1,R);
	LL t1=getsum(maxsuf[o*2],R);
	LL t2=getsum(maxsuf[o*2+1],R);
	if(t1==t2) maxsuf[o]=maxsuf[o*2];
	else maxsuf[o]=t1>t2?maxsuf[o*2]:maxsuf[o*2+1];
	t1=getsum(L,maxpre[o*2]);
	t2=getsum(L,maxpre[o*2+1]);
	if(t1==t2) maxpre[o]=maxpre[o*2];
	else maxpre[o]=t1>t2?maxpre[o*2]:maxpre[o*2+1];
	maxsum[o]=better(maxsum[o*2],maxsum[o*2+1]);
	maxsum[o]=better(maxsum[o],make_pair(maxsuf[o*2],maxpre[o*2+1]));
}
PP query_pre(int o,int L,int R){
	if(y>=maxpre[o]) return make_pair(L,maxpre[o]);
	int M=(L+R)/2;
	if(y<=M) return query_pre(o*2,L,M);
	PP t1=query_pre(o*2+1,M+1,R);
	t1.first=L;
	return better(t1,make_pair(L,maxpre[o*2]));
}
PP query_suf(int o,int L,int R){
	if(x<=maxsuf[o]) return make_pair(maxsuf[o],R);
	int M=(L+R)/2;
	if(x>M) return query_suf(o*2+1,M+1,R);
	PP t1=query_suf(o*2,L,M);
	t1.second=R;
	return better(t1,make_pair(maxpre[o*2+1],R));
}
PP query(int o,int L,int R){
	if(x<=L && y>=R) return maxsum[o];
	int M=(L+R)/2;
	if(x>M) return query(o*2+1,M+1,R);
	if(y<=M) return query(o*2,L,M);
	PP t1=query_suf(o*2,L,M);
	PP t2=query_pre(o*2+1,M+1,R);
	PP t3=better(query(o*2,L,M),query(o*2+1,M+1,R));
	return better(make_pair(t1.first,t2.second),t3);
}
int main(){
	int n,m,c=0;
	while(scanf("%d%d",&n,&m)==2){
		sum[0]=0;
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
			sum[i]=sum[i-1]+a[i];
		}
		build(1,1,n);
		for(int i=1;i<=m;i++){
			scanf("%d%d",&x,&y);
			PP ans=query(1,1,n);
			printf("Case %d:\n",++c);
			printf("%d %d\n",ans.first,ans.second);
		}
	}
	return 0;
}
2022/2/12 18:29
加载中...