45分求条
查看原帖
45分求条
942910
wcr_jason楼主2024/11/25 10:19

除了特性 AA 几乎全部 WA\red{WA}

本人推测可能是分讨错了,建ST表没错,结论也没错,但是调不出来。萌新求条

提交记录

代码:

#include<iostream>
#include<cmath>
#define int long long
using namespace std;
int p[100001];
int a[100001];
int b[100001];
int sa[100001];
int sb[100001];
int a_max[100001][20];
int a_min[100001][20];
int b_max[100001][20];
int b_min[100001][20];
int a_max_b[100001][20];
int a_min_a[100001][20];
int n,m,q,l1,l2,r1,r2;
int q1(){
	int R=r1,L=l1,cur=log2(R-L+1);
	return min(a_min[L][cur],a_min[(R-(1<<cur)+1)][cur]);
}
int q2(){
	int R=r1,L=l1,cur=log2(R-L+1);
	return max(a_max[L][cur],a_max[(R-(1<<cur)+1)][cur]);
}
int q3(){
	int R=r1,L=l1,cur=log2(R-L+1);
	return min(a_min_a[L][cur],a_min_a[(R-(1<<cur)+1)][cur]);
}
int q4(){
	int R=r1,L=l1,cur=log2(R-L+1);
	return max(a_max_b[L][cur],a_max_b[(R-(1<<cur)+1)][cur]);
}
int q5(){
	int R=r2,L=l2,cur=log2(R-L+1);
	return min(b_min[L][cur],b_min[(R-(1<<cur)+1)][cur]);
}
int q6(){
	int R=r2,L=l2,cur=log2(R-L+1);
	return max(b_max[L][cur],b_max[(R-(1<<cur)+1)][cur]);
}
signed main(){
	cin>>n>>m>>q;p[0]=1;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=m;i++)cin>>b[i];
	for(int i=1;i<=20;i++){
		p[i]=p[i-1]*2;
	}
	for(int i=1;i<=n;i++){		
		sa[i]=sa[i-1]+(a[i]>=0);
		a_max[i][0]=a[i];
		a_min[i][0]=a[i];
		a_max_b[i][0]=(a[i]<0?a[i]:-1e12);
		a_min_a[i][0]=(a[i]>=0?a[i]:1e12);
	}
	for(int i=1;i<=m;i++){
		sb[i]=sb[i-1]+(b[i]>=0);
		b_max[i][0]=b[i];
		b_min[i][0]=b[i];
	}
	for(int j=1;p[j]<=n;j++){
		for(int l=1;l+p[j]-1<=n;l++){
			int r=l+p[j]-1;
			a_max[l][j]=max(a_max[l][j-1],a_max[l+p[j-1]][j-1]);
			a_min[l][j]=min(a_min[l][j-1],a_min[l+p[j-1]][j-1]);
			a_max_b[l][j]=max(a_max_b[l][j-1],a_max_b[l+p[j-1]][j-1]);
			a_min_a[l][j]=min(a_min_a[l][j-1],a_min_a[l+p[j-1]][j-1]);
		}
	}
	for(int j=1;p[j]<=m;j++){			
		for(int l=1;l+p[j]-1<=m;l++){
			int r=l+p[j]-1;
			b_max[l][j]=max(b_max[l][j-1],b_max[l+p[j-1]][j-1]);
			b_min[l][j]=min(b_min[l][j-1],b_min[l+p[j-1]][j-1]);
		}
	}
//	for(int i=1;i<=n;i++){for(int j=1;i+p[j]-1<=n;j++)cout<<a_max[i][j]<<" ";cout<<endl;}
//	for(int i=1;i<=n;i++){for(int j=1;i+p[j]-1<=n;j++)cout<<a_min[i][j]<<" ";cout<<endl;}
//	for(int i=1;i<=n;i++){for(int j=1;i+p[j]-1<=n;j++)cout<<a_max_b[i][j]<<" ";cout<<endl;}
//	for(int i=1;i<=n;i++){for(int j=1;i+p[j]-1<=n;j++)cout<<a_min_a[i][j]<<" ";cout<<endl;}
//	for(int i=1;i<=m;i++){for(int j=1;i+p[j]-1<=m;j++)cout<<b_max[i][j]<<" ";cout<<endl;}
//	for(int i=1;i<=m;i++){for(int j=1;i+p[j]-1<=m;j++)cout<<b_min[i][j]<<" ";cout<<endl;}
	for(int i=1;i<=q;i++){
		cin>>l1>>r1>>l2>>r2;
		int a1=sa[r1]-sa[l1-1];		
		int b1=sb[r2]-sb[l2-1];
		if(a1!=0)a1=(a1==r1-l1+1?2:1);
		if(b1!=0)b1=(b1==r2-l2+1?2:1);
		int now=a1*3+b1,ans;
		if(now==0)ans=q1()*q6();
		else if(now==1)ans=q2()*q6();
		else if(now==2)ans=q1()*q5();
		else if(now==3)ans=q1()*q6();
		else if(now==5)ans=q2()*q5();
		else if(now==6)ans=q1()*q5();
		else if(now==7)ans=q1()*q5();
		else if(now==8)ans=q2()*q5();		
		else ans=max(q3()*q5(),q4()*q6());
		cout<<ans<<"\n";
	}
	return 0;
}
2024/11/25 10:19
加载中...