ST表样例都过但0分求调
查看原帖
ST表样例都过但0分求调
638491
Illus1onary_Real1ty楼主2023/8/31 16:32

蒟蒻复习ST表,结果发现不会写了

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;

const int INF = 2e9;
const int N = 1e5 + 10, Logn = 25;
int n, m, q, l1, r1, l2, r2, ans = -INF, logn[N];
int ST_Amax[N][Logn], ST_Amin[N][Logn];
int ST_AminusMax[N][Logn], ST_Aabove0Min[N][Logn];
int ST_Bmax[N][Logn], ST_Bmin[N][Logn];

int calc(int xx, int yy, int op){
	if (op == 0)	return max(xx, yy);
	return min(xx, yy);
}

void Set_ST(int st[][Logn], int x){
	for (int j = 1; j <= Logn; j++)
		for (int i = 1; i + (1<<j) - 1 <= n; i++)
			st[i][j] = calc(st[i][j-1], st[i+(1<<(j-1))][j-1], x);
}

int main(){
	cin >> n >> m >> q;
	for (int i = 1; i <= n; i++){
		int x; cin >> x;
		ST_Amin[i][0] = ST_Amax[i][0] = x;
		ST_Aabove0Min[i][0] = (x>=0 ? x : INF);
		ST_AminusMax[i][0] = (x<0 ? x: -INF);
	}
	for (int i = 1; i <= m; i++){
		cin >> ST_Bmax[i][0];
		ST_Bmin[i][0] = ST_Bmax[i][0];
	}
	logn[1] = 0, logn[2] = 1;
	for (int i = 3; i <= max(n, m); i++)
		logn[i] = logn[i>>1] + 1;
	
	Set_ST(ST_Amax, 0);
	Set_ST(ST_Amin, 1);
	Set_ST(ST_AminusMax, 0);
	Set_ST(ST_Aabove0Min, 1);
	Set_ST(ST_Bmax, 0);
	Set_ST(ST_Bmin, 1);
	
	//cout << endl;
	for (int i = 1; i <= q; i++){
		cin >> l1 >> r1 >> l2 >> r2;
		
		int s1 = logn[r1-l1+1], s2 = logn[r2-l2+1];
		int amx = max(ST_Amax[l1][s1], ST_Amax[r1-(1<<s1)+1][s1]);
		int amn = min(ST_Amin[l1][s1], ST_Amin[r1-(1<<s1)+1][s1]);
		int azmn = min(ST_Aabove0Min[l1][s1], ST_Aabove0Min[r1-(1<<s1)+1][s1]);
		int afmx = max(ST_AminusMax[l1][s1], ST_AminusMax[r1-(1<<s1)+1][s1]);
		int bmx = max(ST_Bmax[l2][s2], ST_Bmax[r2-(1<<s2)+1][s2]);
		int bmn = min(ST_Bmin[l2][s2], ST_Bmin[r2-(1<<s2)+1][s2]);
		
		//cout << endl << amx << " " << amn << " " << afmx << " " << azmn << endl;
		//cout << bmx << " " << bmn << endl << endl;
		
		ans = -INF;
		ans = max(ans, amx * (amx >= 0? bmn : bmx));
		ans = max(ans, amn * (amn >= 0? bmn : bmx));
		if (afmx != -INF)
			ans = max(ans, afmx * bmx);
		if (azmn != INF)
			ans = max(ans, azmn * bmn);
		
		cout << ans << endl /*<< endl*/;
	}
	
	return 0;
}

帮助者送关注,谢谢

2023/8/31 16:32
加载中...