10分求助
查看原帖
10分求助
518487
Edigig_yzx楼主2022/10/3 18:12

RT。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>

using namespace std;

typedef long long ll;

const int N = 200010, INF = 1e9;

int n, q;
ll a[N], f[N];

ll dp(int l, int r)
{
	ll ans = -INF;
	int cnt = 0;
	f[l - 1] = 1; 
	
	for(int i = l; i <= r; i ++)
	    if(a[i] < 0) cnt ++;
	    
    if(cnt % 2)
        for(int i = l; i <= r; i ++)
        {
            if(ans > pow(2, 30)) break;
    	    f[i] = max(f[i - 1] * a[i], a[i]);
    		ans = max(ans, f[i]);
        }
    else
    {
        ans = 1;
        for(int i = l; i <= r; i ++)
            ans *= a[i];
    }
	return ans;
}

int main()
{
	scanf("%d%d", &n, &q);
	for(int i = 1; i <= n; i ++) scanf("%lld", &a[i]);
	for(int i = 1; i <= n; i ++) f[i] = a[i];
	
	int num, l, r;
	while (q --)
	{
		scanf("%d%d%d", &num, &l, &r);
		if(num == 1) a[l] = r;
		else if(num == 2)
		{
		    ll t = dp(l, r);
		    if(l == r)
		    {
		        if(t < 1) puts("1");
		        else printf("%lld\n", t);
		    }
		    else
		    {
    			if(t <= pow(2, 30)) printf("%lld\n", t);
    			else puts("Too large");
		    }
		}
	}
	return 0;
}
2022/10/3 18:12
加载中...