ST表35分求助

P8818 [CSP-S 2022] 策略游戏

你想得太简单了
by 1234567_scp @ 2023-08-24 10:20:38


@[The_Wandering_Earth](/user/809165) ``` #include<bits/stdc++.h> using namespace std; #define ll long long int n, m, q; const int N=100005; ll a[N], b[N], mxb[N][30], mnb[N][30]; ll mxna[N][30], mnpa[N][30], mxpa[N][30], mnna[N][30];//mxna最大负数, mnpa最小非负数 void init() { int inf =0x7fffffff; for(int i = 1; i <= n; i++) { mxpa[i][0] = a[i]; mnpa[i][0] = a[i]>=0? a[i]: inf; mxna[i][0] = a[i]<=0? a[i]:-inf; mnna[i][0] = a[i]; } for(int i = 1; i <= m; i++) mnb[i][0] = mxb[i][0] = b[i]; for(int j = 1; (1<<j) <= n; j++) for(int i = 1; i+(1<<j)-1 <= n; i++) { mxpa[i][j] = max(mxpa[i][j-1], mxpa[i+(1<<(j-1))][j-1]); mnpa[i][j] = min(mnpa[i][j-1], mnpa[i+(1<<(j-1))][j-1]); mxna[i][j] = max(mxna[i][j-1], mxna[i+(1<<(j-1))][j-1]); mnna[i][j] = min(mnna[i][j-1], mnna[i+(1<<(j-1))][j-1]); } for(int j = 1; (1<<j) <= m; j++) for(int i = 1; i+(1<<j)-1 <= m; i++) { mxb[i][j] = max(mxb[i][j-1], mxb[i+(1<<(j-1))][j-1]); mnb[i][j] = min(mnb[i][j-1], mnb[i+(1<<(j-1))][j-1]); } } void query(int l1, int r1, int l2, int r2) { int k1 = log2(r1-l1+1), k2 = log2(r2-l2+1); ll ans; ll maxb=max(mxb[l2][k2], mxb[r2-(1<<k2)+1][k2]); ll minb=min(mnb[l2][k2], mnb[r2-(1<<k2)+1][k2]); ll maxpa=max(mxpa[l1][k1], mxpa[r1-(1<<k1)+1][k1]); ll minpa=min(mnpa[l1][k1], mnpa[r1-(1<<k1)+1][k1]); ll maxna=max(mxna[l1][k1], mxna[r1-(1<<k1)+1][k1]); ll minna=min(mnna[l1][k1], mnna[r1-(1<<k1)+1][k1]); if (minb>=0) ans=maxpa>=0? maxpa*minb: maxna*maxb; else if (maxb<=0) ans=minna<=0? minna*maxb: minpa*minb; else { if (maxpa<0) ans=maxna*maxb; else if (minna>0) ans=minpa*minb; else ans=max(minpa*minb, maxna*maxb); } printf("%lld\n", ans); } 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); init(); for(int i = 1; i <= q; i++) { int l1, r1, l2, r2; scanf("%d%d%d%d", &l1, &r1, &l2, &r2); query(l1, r1, l2, r2); } return 0; }
by 1234567_scp @ 2023-08-24 11:02:16


|