萌新袜子刚学 CSP 代码爆零求助
查看原帖
萌新袜子刚学 CSP 代码爆零求助
759710
LuoFeng_Nanami楼主2023/9/19 21:50

rt,6 个 ST 表做法

#include<bits/stdc++.h>
#define ll long long
#define rll register ll
#define F(i,a,b) for(rll i=a;i<=b;i++)
#define Fdn(i,a,b) for(rll i=a;i>=b;i--)

using namespace std;

const int inf = 0x3f3f3f3f,mod = 1e9 + 7; 
const int maxn = 1e5 + 7,logn = 18;

int amax[maxn][logn];
int amin[maxn][logn];
int amaxn[maxn][logn];
int aminp[maxn][logn];
int bmax[maxn][logn];
int bmin[maxn][logn];
int Logn[maxn];
int a[maxn],b[maxn];
int n,m,q;
int ans;

inline void Logn_Prework(){
	Logn[0] = 0,Logn[1] = 0,Logn[2] = 1;
	F(i,3,maxn)
		Logn[i] = Logn[i / 2] + 1;
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	
	cin >> n >> m >> q;
	
	F(i,1,n){
		cin >> a[i];
		amax[i][0] = amin[i][0] = a[i],
		amaxn[i][0] = (a[i] < 0 ? a[i] : -INF),
		aminp[i][0] = (a[i] >= 0 ? a[i] : INF);
	}
	
	F(i,1,m){
		cin >> b[i];
		bmax[i][0] = bmin[i][0] = b[i];
	}
	
	F(j,1,logn - 1)
		F(i,1,n)
			amax[i][j] = max(amax[i][j - 1],amax[i + (1 << (j - 1))][j - 1]),
			amin[i][j] = min(amin[i][j - 1],amin[i + (1 << (j - 1))][j - 1]),
			amaxn[i][j] = max(amaxn[i][j - 1],amaxn[i + (1 << (j - 1))][j - 1]),
			aminp[i][j] = min(aminp[i][j - 1],aminp[i + (1 << (j - 1))][j - 1]);
		
	F(j,1,logn - 1)
		F(i,1,m)
			bmax[i][j] = max(bmax[i][j - 1],bmax[i + (1 << (j - 1))][j - 1]),
			bmin[i][j] = min(bmin[i][j - 1],bmin[i + (1 << (j - 1))][j - 1]);
	
	while(q--){
		ans = -INF;
		int l,r,l2,r2;
		cin >> l >> r >> l2 >> r2;
		int s = Logn[(r - l + 1)],s2 = Logn[(r2 - l2 + 1)];
		int amx,amn,amxn,amnp,bmx,bmn;
		
		amx = max(amax[l][s],amax[r - (1 << s) + 1][s]),
		amn = min(amin[l][s],amin[r - (1 << s) + 1][s]),
		amxn = max(amaxn[l][s],amaxn[r - (1 << s) + 1][s]),
		amnp = min(aminp[l][s],aminp[r - (1 << s) + 1][s]),
		bmx = max(bmax[l2][s2],bmax[r2 - (1 << s2) + 1][s2]),
		bmn = min(bmin[l2][s2],bmin[r2 - (1 << s2) + 1][s2]);
		
		if(amx >= 0)
			ans = max(ans,amx * bmn);
		else
			ans = max(ans,amx * bmx);
		if(amn >= 0)
			ans = max(ans,amn * bmn);
		else
			ans = max(ans,amn * bmx);
		if(amxn != -INF){
			if(amxn >= 0)
				ans = max(ans,amxn * bmn);
			else
				ans = max(ans,amxn * bmx);
		}
		if(amnp != INF){
			if(amnp >= 0)
				ans = max(ans,amnp * bmn);
			else
				ans = max(ans,amnp * bmx);
		}
			
		
		cout << ans << endl;
	}	
	
	return 0;
}
2023/9/19 21:50
加载中...