mxqz ST表 50pts

P8818 [CSP-S 2022] 策略游戏

我也没看出来,您要不要看看 AC 代码?
by NightTide @ 2022-11-05 15:56:06


```cpp #include<bits/stdc++.h> #define MAXN 100010 #define INF 0x3f3f3f3f using namespace std; typedef long long ll; int n, m, q; ll a[MAXN], b[MAXN], max1[2][MAXN][20], max2[2][MAXN][20], min1[2][MAXN][20], min2[2][MAXN][20]; void pre_work(int op, int n, ll arr[]){ for(int i = 1; i <= n; i++){ max1[op][i][0] = arr[i] >= 0 ? arr[i] : -1; max2[op][i][0] = arr[i] < 0 ? arr[i] : -INF; min1[op][i][0] = arr[i] >= 0 ? arr[i] : INF; min2[op][i][0] = arr[i] < 0 ? arr[i] : 1; } for(int j = 1; j < 20; j++){ for(int i = 1; i + (1 << j) - 1 <= n; i++){ max1[op][i][j] = max(max1[op][i][j - 1], max1[op][i + (1 << (j - 1))][j - 1]); max2[op][i][j] = max(max2[op][i][j - 1], max2[op][i + (1 << (j - 1))][j - 1]); min1[op][i][j] = min(min1[op][i][j - 1], min1[op][i + (1 << (j - 1))][j - 1]); min2[op][i][j] = min(min2[op][i][j - 1], min2[op][i + (1 << (j - 1))][j - 1]); } } } ll query(int op, int tp, int l, int r){ int lg = log2(r - l + 1); ll res; if(tp == 1) res = max(max1[op][l][lg], max1[op][r - (1 << lg) + 1][lg]); if(tp == 2) res = max(max2[op][l][lg], max2[op][r - (1 << lg) + 1][lg]); if(tp == 3) res = min(min1[op][l][lg], min1[op][r - (1 << lg) + 1][lg]); if(tp == 4) res = min(min2[op][l][lg], min2[op][r - (1 << lg) + 1][lg]); return res; } int main(){ scanf("%d%d%d",&n,&m,&q); for(int i = 1; i <= n; i++) scanf("%lld", &a[i]); for(int i = 1; i <= m; i++) scanf("%lld", &b[i]); pre_work(0, n, a); pre_work(1, m, b); while(q--){ int l1, r1, l2, r2; scanf("%d%d%d%d",&l1,&r1,&l2,&r2); ll a1 = query(0, 1, l1, r1), a2 = query(0, 2, l1, r1), a3 = query(0, 3, l1, r1), a4 = query(0, 4, l1, r1); ll b1 = query(1, 1, l2, r2), b2 = query(1, 2, l2, r2), b3 = query(1, 3, l2, r2), b4 = query(1, 4, l2, r2); ll res; if(a4 == 1){ if(b4 == 1) res = a1 * b3; else if(b1 == -1) res = a3 * b4; else res = a3 * b4; }else if(a1 == -1){ if(b4 == 1) res = a2 * b1; else if(b1 == -1) res = a4 * b2; else res = a2 * b1; }else{ if(b4 == 1) res = a1 * b3; else if(b1 == -1) res = a4 * b2; else res = max(a3 * b4, a2 * b1); } printf("%lld\n",res); } return 0; } ```
by NightTide @ 2022-11-05 15:56:23


`for (int i = 2; i <= max(n,m); i ++) lg[i] = lg[i >> 1] + 1;`
by MoonFlower @ 2022-11-05 16:31:05


|