65分!实在不知道哪还有错误了,求调,玄关
查看原帖
65分!实在不知道哪还有错误了,求调,玄关
782904
哈哈人生楼主2023/9/30 15:54

思路:a和b分别建最大值和最小值的ST表,按a的abs也建一个。
悬赏关注+赞博客,谢谢!!!

#include<bits/stdc++.h>
#define int long long
#define N 500005
using namespace std;
int n,m,q,a[N],b[N],aST_min[N][70],aST_max[N][70],bST_min[N][70],bST_max[N][70],aLOG[N],bLOG[N];
int aabs[N][70],babs[N][70];
int l1,r1,l2,r2;
int amin(int x,int y) {
	if(abs(x)<abs(y))return x;
	else if(abs(x)>abs(y))return y;
	else {
		if(x<y)return x;
		else return y;
	}
}
int bmin(int x,int y) {
	if(abs(x)<abs(y))return x;
	else if(abs(x)>abs(y))return y;
	else {
		if(x>y)return x;
		else return y;
	}
}
void abuild_LOG() {
	aLOG[0]=-1;
	for(int i=1; i<=n; i++)aLOG[i]=aLOG[i>>1]+1;
}
void abuild_ST() {
	for(int i=1; i<=n; i++) {
		aST_min[i][0]=a[i];
		aST_max[i][0]=a[i];
	}
	for(int lg=1; lg<=aLOG[n]; lg++) {
		for(int i=1; i+(1<<lg)-1<=n; i++) {
			aST_min[i][lg]=min(aST_min[i][lg-1],aST_min[i+(1<<(lg-1))][lg-1]);
			aST_max[i][lg]=max(aST_max[i][lg-1],aST_max[i+(1<<(lg-1))][lg-1]);
		}
	}
}
int afind_min(int l,int r) {
	return min(aST_min[l][aLOG[r-l+1]],aST_min[r-(1<<aLOG[r-l+1])+1][aLOG[r-l+1]]);
}
int afind_max(int l,int r) {
	return max(aST_max[l][aLOG[r-l+1]],aST_max[r-(1<<aLOG[r-l+1])+1][aLOG[r-l+1]]);
}
void bbuild_LOG() {
	bLOG[0]=-1;
	for(int i=1; i<=m; i++)bLOG[i]=bLOG[i>>1]+1;
}
void bbuild_ST() {
	for(int i=1; i<=m; i++) {
		bST_min[i][0]=b[i];
		bST_max[i][0]=b[i];
	}
	for(int lg=1; lg<=bLOG[m]; lg++) {
		for(int i=1; i+(1<<lg)-1<=m; i++) {
			bST_min[i][lg]=min(bST_min[i][lg-1],bST_min[i+(1<<(lg-1))][lg-1]);
			bST_max[i][lg]=max(bST_max[i][lg-1],bST_max[i+(1<<(lg-1))][lg-1]);
		}
	}
}
int bfind_min(int l,int r) {
	return min(bST_min[l][bLOG[r-l+1]],bST_min[r-(1<<bLOG[r-l+1])+1][bLOG[r-l+1]]);
}
int bfind_max(int l,int r) {
	return max(bST_max[l][bLOG[r-l+1]],bST_max[r-(1<<bLOG[r-l+1])+1][bLOG[r-l+1]]);
}
void build_aabs() {
	for(int i=1; i<=n; i++)aabs[i][0]=a[i];
	for(int lg=1; lg<=aLOG[n]; lg++) {
		for(int i=1; i+(1<<lg)-1<=n; i++) {
			aabs[i][lg]=amin(aabs[i][lg-1],aabs[i+(1<<(lg-1))][lg-1]);
		}
	}
}
int aabs_min(int l,int r) {
	return amin(aabs[l][aLOG[r-l+1]],aabs[r-(1<<aLOG[r-l+1])+1][aLOG[r-l+1]]);
}
void build_babs() {
	for(int i=1; i<=n; i++)babs[i][0]=a[i];
	for(int lg=1; lg<=aLOG[n]; lg++) {
		for(int i=1; i+(1<<lg)-1<=n; i++) {
			babs[i][lg]=bmin(babs[i][lg-1],babs[i+(1<<(lg-1))][lg-1]);
		}
	}
}
int babs_min(int l,int r) {
	return bmin(babs[l][aLOG[r-l+1]],babs[r-(1<<aLOG[r-l+1])+1][aLOG[r-l+1]]);
}
void gai(int &x) {
	if(x<=0)x*=bfind_max(l2,r2);
	else x*=bfind_min(l2,r2);
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>m>>q;
	for(int i=1; i<=n; i++)cin>>a[i];
	for(int i=1; i<=m; i++)cin>>b[i];
	abuild_LOG();
	bbuild_LOG();
	abuild_ST();
	bbuild_ST();
	build_aabs();
	build_babs();
	while(q--) {
		cin>>l1>>r1>>l2>>r2;
		int x=aabs_min(l1,r1),y=babs_min(l1,r1),x2=afind_min(l1,r1),y2=afind_max(l1,r1);
		gai(x),gai(y),gai(x2),gai(y2);
		cout<<max(max(x,y),max(x2,y2))<<endl;
	}
	return 0;
}
2023/9/30 15:54
加载中...