社区讨论

st表样例没过求调

P8818[CSP-S 2022] 策略游戏参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo28i6a1
此快照首次捕获于
2023/10/23 09:43
2 年前
此快照最后确认于
2023/11/03 09:57
2 年前
查看原帖
CPP
// Problem: P8818 [CSP-S 2022] 策略游戏
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P8818
// Memory Limit: 512 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;
#define mem(arr,val) memset((arr),(val),(sizeof(arr)))
using namespace std;
const int maxn = 1e5+5;
const int inf = 2147483647;
int n,m,q,a[maxn],b[maxn];
int log_2[maxn],amax[maxn][25],bmax[maxn][25],amin[maxn][25],bmin[maxn][25],afmax[maxn][25],affmin[maxn][25];
int get_maxa(int l,int r)
{
	int x = log_2[r-l+1];
	return max(amax[l][x],amax[r-(1<<x)+1][x]);
}
int get_mina(int l,int r)
{
	int x = log_2[r-l+1];
	return min(amin[l][x],amin[r-(1<<x)+1][x]);
}
int get_maxb(int l,int r)
{
	int x = log_2[r-l+1];
	return max(bmax[l][x],bmax[r-(1<<x)+1][x]);
}
int get_minb(int l,int r)
{
	int x = log_2[r-l+1];
	return min(bmin[l][x],bmin[r-(1<<x)+1][x]);
}
int get_minaff(int l,int r)
{
	int x = log_2[r-l+1];
	return min(affmin[l][x],affmin[r-(1<<x)+1][x]);
}
int get_maxaf(int l,int r)
{
	int x = log_2[r-l+1];
	return max(afmax[l][x],afmax[r-(1<<x)+1][x]);
}
int main(int argc,char *argv[])
{
	scanf("%d%d%d",&n,&m,&q);
	for(int i = 2;i <= n;++i)
		log_2[i] = log_2[i>>1]+1;
	for(int i = 1;i <= n;++i) scanf("%d",&a[i]);
	for(int i = 1;i <= m;++i) scanf("%d",&b[i]);
	for(int i = 1;i <= n;++i)
	{
		amax[i][0] = amin[i][0] = a[i];
		afmax[i][0] = (a[i]>=0?-1*inf:a[i]);
		affmin[i][0] = (a[i]<=0?inf:a[i]);
	}
	for(int i = 1;i <= m;++i)
		bmax[i][0] = bmin[i][0] = b[i];
	for(int j = 1;(1<<j) <= n;++j)
		for(int i = 1;i <= n-(1<<j)+1;++i)
		{
			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]);
			afmax[i][j] = max(afmax[i][j-1],afmax[i+(1<<j-1)][j-1]);
			affmin[i][j] = min(affmin[i][j-1],affmin[i+(1<<j-1)][j-1]);
		}
	for(int j = 1;(1<<j) <= m;++j)
		for(int i = 1;i <= m-(1<<j)+1;++i)
		{
			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--)
	{
		int l1,r1,l2,r2;
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		int ax = get_maxa(l1,r1);
		int an = get_mina(l1,r1);
		int bx = get_maxb(l2,r2);
		int bn = get_minb(l2,r2);
		int afx = get_maxaf(l1,r1);
		int affn = get_minaff(l1,r1);
		int ans = -1*inf;
		if(bn >= 0) ans = max(ans,ax*bn);
		else ans = max(ans,affn*bn);
		if(bx >= 0) ans = max(ans,bx*afx);
		else ans = max(ans,bx*an);
		printf("%d\n",ans);
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...