40pts求助,悬赏关注
查看原帖
40pts求助,悬赏关注
600723
Yujinhe469楼主2023/2/25 13:12

仅在满足特殊条件一时正确


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=200009;
const ll INF=1e18+7;
ll n,m,q,a[N],b[N],st[7][36][N];
inline void ST1(){
	for(ll i=1;i<=n;i++) st[1][0][i]=a[i];
	ll p=log(n)/log(2);
	for(ll k=1;k<=p;k++)
		for(ll i=1;i<=n-(1<<k)+1;i++)
			st[1][k][i]=max(st[1][k-1][i],st[1][k-1][i+(1<<(k-1))]);
}
inline void ST2(){
	for(ll i=1;i<=n;i++) st[2][0][i]=a[i];
	ll p=log(n)/log(2);
	for(ll k=1;k<=p;k++)
		for(ll i=1;i<=n-(1<<k)+1;i++)
			st[2][k][i]=min(st[2][k-1][i],st[2][k-1][i+(1<<(k-1))]);
}
inline void ST3(){
	for(ll i=1;i<=n;i++)
		if(a[i]<0) st[3][0][i]=a[i];
		else st[3][0][i]=-INF;
	ll p=log(n)/log(2);
	for(ll k=1;k<=p;k++)
		for(ll i=1;i<=n-(1<<k)+1;i++)
			st[3][k][i]=max(st[3][k-1][i],st[3][k-1][i+(1<<(k-1))]);
}
inline void ST4(){
	for(ll i=1;i<=n;i++)
		if(a[i]>=0) st[4][0][i]=a[i];
		else st[4][0][i]=INF;
	ll p=log(n)/log(2);
	for(ll k=1;k<=p;k++)
		for(ll i=1;i<=n-(1<<k)+1;i++)
			st[4][k][i]=min(st[4][k-1][i],st[4][k-1][i+(1<<(k-1))]);
}
inline void ST5(){
	for(ll i=1;i<=m;i++) st[5][0][i]=b[i];
	ll p=log(m)/log(2);
	for(ll k=1;k<=p;k++)
		for(ll i=1;i<=m-(1<<k)+1;i++)
			st[5][k][i]=max(st[5][k-1][i],st[5][k-1][i+(1<<(k-1))]);
}
inline void ST6(){
	for(ll i=1;i<=m;i++) st[6][0][i]=b[i];
	ll p=log(m)/log(2);
	for(ll k=1;k<=p;k++)
		for(ll i=1;i<=m-(1<<k)+1;i++)
			st[6][k][i]=min(st[6][k-1][i],st[6][k-1][i+(1<<(k-1))]);
}
ll query(ll l1,ll r1,ll l2,ll r2){
	ll ans=-INF;
	ll p1=log(r1-l1+1)/log(2),p2=log(r2-l2+1)/log(2);
	ll miny=min(st[6][p2][l2],st[6][p2][r2-(1<<p2)+1]);
	ll maxy=max(st[5][p2][l2],st[5][p2][r2-(1<<p2)+1]);
	if(miny>=0)
		ans=max(ans,miny*max(st[1][p1][l1],st[1][p1][r1-(1<<p1)+1]));
	if(miny<0)
		if(min(st[4][p1][l1],st[4][p1][r1-(1<<p1)+1])!=INF)
			ans=max(ans,miny*min(st[4][p1][l1],st[4][p1][r1-(1<<p1)+1]));
	if(maxy>=0)
		if(max(st[3][p1][l1],st[3][p1][r1-(1<<p1)+1])!=-INF)
			ans=max(ans,maxy*max(st[3][p1][l1],st[3][p1][r1-(1<<p1)+1]));
	if(maxy<0)
		ans=max(ans,maxy*min(st[2][p1][l1],st[2][p1][r1-(1<<p1)+1]));
	return ans;
}
int main(){
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) cin>>b[i];
	//cout<<"qwq"<<endl;
	ST1(); ST2(); ST3(); ST4(); ST5(); ST6();
	//cout<<"qaq"<<endl;
	while(q--){
		ll L1,r1,l2,r2;
		cin>>L1>>r1>>l2>>r2;
		cout<<query(L1,r1,l2,r2)<<endl;
	}
	return 0;
}


ST表做法

2023/2/25 13:12
加载中...