社区讨论
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 条回复,欢迎继续交流。
正在加载回复...