WA #37 95pts 求助
查看原帖
WA #37 95pts 求助
1268478
時空楼主2024/10/9 20:52
#include <bits/stdc++.h>

#define FstIO ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pb push_back
#define mem(a, v) memset(a, v, sizeof a)
#define pii pair<ll, ll>

using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
 
const ll N = 2e5 + 5, M = 5e2 + 5; 
const ll mod = 1e9 + 7, mod2 = 998244353;
const ld eps = 1e-6;

ll n, m, q;

ll A[N], B[N];
ll fA[N], fB[N];

// ¸ºÊý×î´óÖµ and ÕýÊý×îСֵ 

struct node
{
	ll l, r;
	ll Mx, Mn;
} ta[N << 2], tb[N << 2], ta2[N << 2];

#define ls (k << 1)
#define rs (k << 1 | 1)

void pushupA(ll k) 
{
	ta[k].Mx = max(ta[ls].Mx, ta[rs].Mx);
	ta[k].Mn = min(ta[ls].Mn, ta[rs].Mn);
	
	ta2[k].Mx = max(ta2[ls].Mx, ta2[rs].Mx);
	ta2[k].Mn = min(ta2[ls].Mn, ta2[rs].Mn);
}

void buildA(ll k, ll l, ll r)
{
	ta[k] = {l, r, 0, 0}; ta2[k] = {l, r, 0, 0};
	if (l == r) 
	{
		ll c = 1e10;
		ta[k] = {l, r, A[l], A[l]};
		if (A[l] >= 0) ta2[k] = {l, r, -c, A[l]};
		else ta2[k] = {l, r, A[l], c};
		return ;
	}
	ll mid = (l + r) >> 1;
	buildA(k << 1, l, mid),
	buildA(k << 1 | 1, mid + 1, r);
	
	pushupA(k);
}

void pushupB(ll k)
{
	tb[k].Mx = max(tb[ls].Mx, tb[rs].Mx);
	tb[k].Mn = min(tb[ls].Mn, tb[rs].Mn);
}

void buildB(ll k, ll l, ll r)
{
	tb[k] = {l, r, 0, 0}; 
	if (l == r) 
	{
		tb[k] = {l, r, B[l], B[l]};
		return ;
	}
	ll mid = (l + r) >> 1;
	buildB(k << 1, l, mid),
	buildB(k << 1 | 1, mid + 1, r);
	
	pushupB(k);
}

ll QmxA(ll k, ll l, ll r, ll ql, ll qr)
{
	if (ql <= l && r <= qr) return ta[k].Mx;
	ll mid = (l + r) >> 1, s = -1e11;
	if (ql <= mid) s = max(s, QmxA(ls, l, mid, ql, qr));
	if (qr > mid) s = max(s, QmxA(rs, mid + 1, r, ql, qr));
	return s;
}

ll QmnA(ll k, ll l, ll r, ll ql, ll qr)
{
	if (ql <= l && r <= qr) return ta[k].Mn;
	ll mid = (l + r) >> 1, s = 1e11;
	if (ql <= mid) s = min(s, QmnA(ls, l, mid, ql, qr));
	if (qr > mid) s = min(s, QmnA(rs, mid + 1, r, ql, qr));
	return s;
}

ll QmxB(ll k, ll l, ll r, ll ql, ll qr)
{
	if (ql <= l && r <= qr) return tb[k].Mx;
	ll mid = (l + r) >> 1, s = -1e11;
	if (ql <= mid) s = max(s, QmxB(ls, l, mid, ql, qr));
	if (qr > mid) s = max(s, QmxB(rs, mid + 1, r, ql, qr));
	return s;
}

ll QmnB(ll k, ll l, ll r, ll ql, ll qr)
{
	if (ql <= l && r <= qr) return tb[k].Mn;
	ll mid = (l + r) >> 1, s = 1e11;
	if (ql <= mid) s = min(s, QmnB(ls, l, mid, ql, qr));
	if (qr > mid) s = min(s, QmnB(rs, mid + 1, r, ql, qr));
	return s;
}

ll Qmx_nega(ll k, ll l, ll r, ll ql, ll qr)
{
	if (ql <= l && r <= qr) return ta2[k].Mx;
	ll mid = (l + r) >> 1, s = -1e11;
	if (ql <= mid) s = max(s, Qmx_nega(ls, l, mid, ql, qr));
	if (qr > mid) s = max(s, Qmx_nega(rs, mid + 1, r, ql, qr));
	return s;
}

ll Qmn_pos(ll k, ll l, ll r, ll ql, ll qr)
{
	if (ql <= l && r <= qr) return ta2[k].Mn;
	ll mid = (l + r) >> 1, s = 1e11;
	if (ql <= mid) s = min(s, Qmn_pos(ls, l, mid, ql, qr));
	if (qr > mid) s = min(s, Qmn_pos(rs, mid + 1, r, ql, qr));
	return s;
}

/*
1 3 1
7
0 -5 -3
1 1 1 3

-35
*/

signed main()
{
//	freopen("game.in", "r", stdin);
//	freopen("game.out", "w", stdout);

	FstIO; 
	
    cin >> n >> m >> q;
    for (ll i = 1; i <= n; ++ i ) cin >> A[i];
    for (ll i = 1; i <= m; ++ i ) cin >> B[i];
    for (ll i = 1; i <= n; ++ i ) fA[i] = fA[i - 1] + (!A[i]);
    for (ll i = 1; i <= m; ++ i ) fB[i] = fB[i - 1] + (!B[i]);
    
    buildA(1, 1, n);
    buildB(1, 1, m);
    
    while (q -- )
    {
    	ll l1, r1, l2, r2;
    	cin >> l1 >> r1 >> l2 >> r2;
    	
    	/*
 	  	cout << "New\n";
    	cout << QmxA(1, 1, n, l1, r1) << ' ';
    	cout << QmnA(1, 1, n, l1, r1) << ' ';
    	cout << QmxB(1, 1, m, l2, r2) << ' ';
    	cout << QmnB(1, 1, m, l2, r2) << ' ';
    	cout << Qmx_nega(1, 1, n, l1, r1) << ' '; // negative max
    	cout << Qmn_pos(1, 1, n, l1, r1) << '\n'; // positive min
    	
    	continue;
    	*/
    	
    	
    	
    	ll ca = fA[r1] - fA[l1 - 1];
    	ll cb = fB[r2] - fB[l2 - 1];
    	
    	ll p = QmnA(1, 1, n, l1, r1), Answer;
    	if (p > 0)
    	{
    		ll k = QmnB(1, 1, m, l2, r2);
    		if (k > 0) 
    			Answer = QmxA(1, 1, n, l1, r1) * QmnB(1, 1, m, l2, r2);
    		else
    			Answer = QmnA(1, 1, n, l1, r1) * QmnB(1, 1, m, l2, r2);
    		if (ca > 0) Answer = max(Answer, 0ll);
    		if (cb > 0) Answer = min(Answer, 0ll);
    		
    		cout << Answer << '\n'; continue;
    	}
    	
    	p = QmxA(1, 1, n, l1, r1);
    	if (p < 0)
    	{
    		ll k = QmxB(1, 1, m, l2, r2);
    		if (k < 0) 
    			Answer = QmnA(1, 1, n, l1, r1) * QmxB(1, 1, m, l2, r2);
    		else 
    			Answer = QmxA(1, 1, n, l1, r1) * QmxB(1, 1, m, l2, r2);	
    		if (ca > 0) Answer = max(Answer, 0ll);
    		if (cb > 0) Answer = min(Answer, 0ll);
    		
    		cout << Answer << '\n'; continue;
    	}
    	
    	ll k = QmxB(1, 1, m, l2, r2);
    	if (k < 0) 
    		Answer = QmnA(1, 1, n, l1, r1) * QmxB(1, 1, m, l2, r2);
    	else
    	{
    		k = QmnB(1, 1, n, l2, r2);
    		if (k > 0)
    			Answer = QmxA(1, 1, n, l1, r1) * QmnB(1, 1, m, l2, r2);
    		else
    		{
    			Answer = max(Qmx_nega(1, 1, n, l1, r1) * QmxB(1, 1, m, l2, r2), 
							 Qmn_pos(1, 1, n, l1, r1) * QmnB(1, 1, m, l2, r2));
    		}
    	}
    	
    	if (ca > 0) Answer = max(Answer, 0ll);
    	if (cb > 0) Answer = min(Answer, 0ll);
    	
    	cout << Answer << '\n';
    }
	
	return 0;
	
	cout.flush();
}
2024/10/9 20:52
加载中...