40 pts 求调
查看原帖
40 pts 求调
255077
麦克斯韦の妖楼主2022/10/5 23:10

不知道为什么输出了负数,我觉的我找 [l,r] 最左边和最右边的负数没问题啊。

#include<iostream> 
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#define ls o<<1
#define rs o<<1|1
using namespace std;
typedef long long ll;
const int N=2e5+10;
const int MAXN=1073741824;
ll tr[N<<2];
int flag[N<<2];
int n,q;
ll a[N];
void read(ll &x){
    int fx=1;
	x=0;
	char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') fx=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    x=x*fx;
}
int main()
{
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)
	{
		read(a[i]); 
	}
	for(int i=1;i<=q;i++)
	{
		int op;
		scanf("%d",&op);
		if(op==1)
		{
			int d;
			ll x;
			scanf("%d%lld",&d,&x);
			a[d]=x;
		}
		else
		{
			ll l,r;
			read(l),read(r);
			if(r-l+1>=61)
			{
				printf("Too large\n");
				continue;
			}
			ll ans=1,res=1;
			bool flag=false;
			int L=l-1,R=r+1;
			for(int j=l;j<=r;j++)
			{
				if(a[j]<0)
				{
					L=j;
					break;
				}
			}
			for(int j=r;j>=l;j--)
			{
				if(a[j]<0)
				{
					R=j;
					break;
				}
			} 
			for(int j=L+1;j<=r;j++)
			{
				ans*=a[j];
				if(abs(ans)>MAXN)
				{
					flag=true;
					break;
				}
			}
			for(int j=l;j<=R-1;j++)
			{
				res*=a[j];
				if(abs(res)>MAXN)
				{
					flag=true;
					break;
				}
			}
			if(flag)
			{
				printf("Too large\n");
			}
			else printf("%lld\n",max(ans,res));
		}
	}
}

2022/10/5 23:10
加载中...