ST表爆0求助
查看原帖
ST表爆0求助
253068
CodeBoy楼主2022/11/2 18:39

4 个 ST 表打性质1、2, 全部WA

#include <bits/stdc++.h>
#define F(i, l, r) for(int i = l; i < r; ++i)
#define Fe(i, l, r) for(int i = l; i <= r; ++i)
#define Fer(i, l, r) for(int i = l; i >= r; --i)
#define reopen(A) { freopen(#A".in", "r", stdin); freopen(#A".out", "w", stdout); }
using namespace std;
typedef long long ll;
constexpr int N = 200005;
ll n, m, q;
ll a[N], b[N];
ll st[N][20], st2[N][20], st3[N][20], st4[N][20];
ll lg[N];
#define int long long

void init(){
	lg[1] = 0;
	for(int i = 2; i < N; i ++){
		lg[i] = lg[i / 2] + 1;
	}
	for(int i = 1; i <= n; i ++){
		st[i][0] = a[i];
	}

	for(int i = 1; i <= m; i ++){
		st2[i][0] = b[i];
	}

	for(int i = 1; i <= m; i ++){
		st4[i][0] = b[i];
	}

	for(int i = 1; i <= n; i ++){
		st3[i][0] = a[i];
	}

	for(int i = 1; i <= lg[n]; i++){
		for(int l = 1; l <= n; l ++){
			st[l][i] = max(st[l][i - 1], st[l + (1 << (i - 1))][i - 1]);
		}
	}

	for(int i = 1; i <= lg[m]; i++){
		for(int l = 1; l <= m; l ++){
			st4[l][i] = max(st4[l][i - 1], st4[l + (1 << (i - 1))][i - 1]);
		}
	}

	for(int i = 1; i <= lg[m]; i++){
		for(int l = 1; l <= m; l ++){
			st2[l][i] = min(st2[l][i - 1], st2[l + (1 << (i - 1))][i - 1]);
		}
	}

	for(int i = 1; i <= lg[n]; i++){
		for(int l = 1; l <= n; l ++){
			st3[l][i] = min(st3[l][i - 1], st3[l + (1 << (i - 1))][i - 1]);
		}
	}
}

ll c(int x, int y){
	return a[x] * b[y];
}


ll querymx(int l1, int r1){
	if(l1 == r1) return a[l1];
//	cerr<<((lg[r1 - l1 + 1]) << 1)<<' '<< r1 - ((lg[r1 - l1 + 1]) << 1) + 1<<endl;
	ll mx = max(st[l1][lg[r1 - l1 + 1]], st[r1 - ((lg[r1 - l1 + 1]) << 1) + 1][lg[r1 - l1 + 1]]);
	return mx;
}


ll querymi(int l1, int r1){
	if(l1 == r1) return b[l1];
//	cerr<<((lg[r1 - l1 + 1]) << 1)<<' '<< r1 - ((lg[r1 - l1 + 1]) << 1) + 1<<endl;
	ll mi = min(st2[l1][lg[r1 - l1 + 1]], st2[r1 - ((lg[r1 - l1 + 1]) << 1) + 1][lg[r1 - l1 + 1]]);
	return mi;
}

ll querymx_b(int l1, int r1){
	if(l1 == r1) return b[l1];
//	cerr<<((lg[r1 - l1 + 1]) << 1)<<' '<< r1 - ((lg[r1 - l1 + 1]) << 1) + 1<<endl;
	ll mx = max(st4[l1][lg[r1 - l1 + 1]], st4[r1 - ((lg[r1 - l1 + 1]) << 1) + 1][lg[r1 - l1 + 1]]);
	return mx;
}

ll querymi_a(int l1, int r1){
	if(l1 == r1) return a[l1];
//	cerr<<((lg[r1 - l1 + 1]) << 1)<<' '<< r1 - ((lg[r1 - l1 + 1]) << 1) + 1<<endl;
	ll mi = min(st3[l1][lg[r1 - l1 + 1]], st3[r1 - ((lg[r1 - l1 + 1]) << 1) + 1][lg[r1 - l1 + 1]]);
	return mi;
}


ll query(int l1, int r1, int l2, int r2){
	if(l1 == r1 && a[l1] < 0){
		return querymx_b(l2, r2) * a[l1];
	}
	if(l2 == r2 && b[l2] < 0){
		return querymi_a(l1, r1) * b[l2];
	}
	ll mi, mx;
	mx = querymx(l1, r1);
	mi = querymi(l2, r2);
	return mi * mx;
}

signed main(){
	//reopen(game);
	ios::sync_with_stdio(); cin.tie(0);
	cin>>n>>m>>q;
	Fe(i, 1, n) cin>>a[i];
	Fe(i, 1, m) cin>>b[i];
	init();
//	cerr<<st[1][2]<<endl;
//	cerr<<lg[3]<<endl;
	while(q--){
		int l1, r1, l2, r2;
		cin>>l1>>r1>>l2>>r2;
		cout<<query(l1, r1, l2, r2)<<'\n';
//		cout<<querymx(l1, r1)<<endl;
	}
	return 0;
}

2022/11/2 18:39
加载中...