ST表35分求助
查看原帖
ST表35分求助
809165
The_Wandering_Earth楼主2023/8/13 21:34

rt,有性质1的点都对了,其他全错。

#include<bits/stdc++.h>

using namespace std;

#define int long long

int n, m, q;
int a[100005], b[100005], mxa[100005][30], mna[100005][30], mxb[100005][30], mnb[100005][30];
int mxna[100005][30], mnpa[100005][30];//mxna最大负数, mnpa最小非负数 
 
void init()
{
	int inf =LONG_LONG_MAX;
	for(int i = 1; i <= n; i++)
	{
		mxa[i][0] = a[i];
		mna[i][0] = a[i];
		if(a[i] < 0)mxna[i][0] = a[i];
		else mxna[i][0] = -inf;
		if(a[i] >= 0)mnpa[i][0] = a[i];
		else mnpa[i][0] = inf;
	}
	for(int i = 1; i <= m; i++)
	{
		mxb[i][0] = b[i];
		mnb[i][0] = b[i];
	}
	for(int j = 1; (1 << j) <= n; j++)
	{
		for(int i = 1; i + (1 << j) - 1 <= n; i++)
		{
			mxa[i][j] = max(mxa[i][j - 1], mxa[i + (1 << (j - 1))][j - 1]);
			mna[i][j] = min(mna[i][j - 1], mna[i + (1 << (j - 1))][j - 1]);
			mxna[i][j] = max(mxna[i][j - 1], mxna[i][j]);
			mxna[i][j] = max(mxna[i + (1 << (j - 1))][j - 1], mxna[i][j]);
			mnpa[i][j] = min(mnpa[i][j - 1], mnpa[i][j]);
			mnpa[i][j] = min(mnpa[i + (1 << (j - 1))][j - 1], mnpa[i][j]);
			
		}
	}
	for(int j = 1; (1 << j) <= m; j++)
	{
		for(int i = 1; i + (1 << j) - 1 <= m; i++)
		{
			mxb[i][j] = max(mxb[i][j - 1], mxb[i + (1 << (j - 1))][j - 1]);
			mnb[i][j] = min(mnb[i][j - 1], mnb[i + (1 << (j - 1))][j - 1]);
		}
	}
}

void query(int l1, int r1, int l2, int r2)
{
	int k1 = log2(r1 - l1 + 1), k2 = log2(r2 - l2 + 1);
	int x, y, sum = -1e9, ans = -1e9;
	
	//  1 : x < 0, y = max{}
	y = max(mxb[l2][k2], mxb[r2 - (1 << k2) + 1][k2]);
	if(y >= 0)x = max(mxna[l1][k1], mxna[r1 - (1 << k1) + 1][k1]), sum = max(sum, x * y);
	else x = min(mna[l1][k1], mna[r1 - (1 << k1) + 1][k1]), sum = max(sum, x * y);
	//cout << x << " " << y << " " << sum << endl;
	if(x < 0)ans = max(ans, sum); 
	sum = -1e9;
	//  2 : x >= 0, y = min{}
	y = min(mnb[l2][k2], mnb[r2 - (1 << k2) + 1][k2]);
	if(y >= 0)x = max(mxa[l1][k1], mxa[r1 - (1 << k1) + 1][k1]), sum = max(sum, x * y);
	else x = min(mnpa[l1][k1], mnpa[r1 - (1 << k1) + 1][k1]), sum = max(sum, x * y);
	if(x >= 0)ans = max(ans, sum);
	cout << ans << endl;
}


signed 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];
	}
	init();
	for(int i = 1; i <= q; i++)
	{
		int l1, r1, l2, r2;
		cin >> l1 >> r1 >> l2 >> r2;
		query(l1, r1, l2, r2);
	}
	return 0;
}
2023/8/13 21:34
加载中...