样例全过,但是交上去全WA
查看原帖
样例全过,但是交上去全WA
561949
syr1125楼主2023/8/23 16:34
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 100005, M = 100005; 
int n, m, q;
int a[N], b[M];
int cfmin[N][25], zmin[N][25], cfmax[N][25], zmax[N][25];
int bmin[M][25], bmax[M][25];
int cclog[N];

const int maxinf = LONG_LONG_MAX, mininf = LONG_LONG_MIN;

signed main()
{
	scanf("%lld %lld %lld", &n, &m, &q);
	for (int i = 1; i <= n; i ++)
	{
		scanf("%lld", &a[i]);
		zmax[i][0] = cfmin[i][0] = a[i];
    	cfmax[i][0] = (a[i] < 0 ? a[i] : mininf);
        zmin[i][0] = (a[i] >= 0 ? a[i] : maxinf);
	}
	for (int i = 1; i <= m; i ++)
	{
		scanf("%lld", &b[i]);
		bmin[i][0] = bmax[i][0] = b[i];
	}
	
	for (int i = 2; i <= max(n, m); i ++)
	{
		cclog[i] = cclog[i >> 1] + 1;
	}
	
	for (int j = 1; j <= cclog[n]; j ++) 
	{
        for (int i = 1; i + (1 << j) - 1 <= n; i ++) 
		{
            int p = i + (1 << (j - 1));
            zmax[i][j] = max(zmax[i][j - 1], zmax[p][j - 1]);
            cfmax[i][j] = max(cfmax[i][j - 1], cfmax[p][j - 1]);
            zmin[i][j] = min(zmin[i][j - 1], zmin[p][j - 1]);
            cfmin[i][j] = min(cfmin[i][j - 1], cfmin[p][j - 1]);
        }
    }

    for (int j = 1; j <= cclog[m]; j ++) 
	{
        for (int i = 1; i + (1 << j) - 1 <= m; i ++) 
		{
            int p = i + (1 << (j - 1));
            bmax[i][j] = max(bmax[i][j - 1], bmax[p][j - 1]);
            bmin[i][j] = min(bmin[i][j - 1], bmin[p][j - 1]);
        }
    }
	
	while (q --)
	{
		int la, ra, lb, rb;
		int xa, xb, ya, yb;
		scanf("%lld %lld %lld %lld", &la, &ra, &lb, &rb);
		xa = cclog[ra - la + 1], xb = cclog[rb - lb + 1];
        ya = ra - (1 << xa) + 1, yb = rb - (1 << xb) + 1;
        
        int azmx = max(zmax[la][xa], zmax[ya][xa]);
        int azmn = min(zmin[la][xa], zmin[ya][xa]);
        int afmx = max(cfmax[la][xa], cfmax[ya][xa]);
        int afmn = min(cfmin[la][xa], cfmin[ya][xa]);
        int bmx = max(bmax[lb][xb], bmax[yb][xb]);
        int bmn = min(bmin[lb][xb], bmin[yb][xb]);
        //printf("%lld %lld %lld %lld %lld %lld\n", azmx, azmn, afmx, afmn, bmx, bmn);
		        
        int first = azmx * bmn;
        int second = azmn * bmn;
        int third = afmx * bmx;
        int forth = afmn * bmx;
        cout << max(max(first, second), max(third, forth)) << endl;
	}
	return 0;
}

代码抄仿照第一篇题解写的。

提交记录(其实有一个点AC了)

2023/8/23 16:34
加载中...