95pts求助
查看原帖
95pts求助
377440
Y2y7m楼主2022/10/3 18:27

正常做法,不知道最后一个点错哪里了:

#include <bits/stdc++.h>

using namespace std;
#pragma optimize(2)
#define int long long
const int maxn=2e5+10;
int n,m;
int a[maxn];
int f1[maxn],f2[maxn];
const int biggest=1<<30;
signed main()
{
//	freopen("T1.in","r",stdin);
//	freopen("T1.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	int op,x,y;
	int c=0;
	for(int j=1;j<=m;j++)
	{
		scanf("%lld%lld%lld",&op,&x,&y);
		if(op==1)
			a[x]=y;
		if(op==2)
		{
			c++;
			if(y-x>70)
			{
				printf("Too large\n");
				continue;			
			}
			for(int i=x-1;i<=y;i++)
				f1[i]=f2[i]=0;
			f1[x-1]=f2[x-1]=1;
			int ff=0;
			for(int i=x;i<=y;i++)
				if(a[i]<0)
					ff++;
			if(ff==1)
			{
				//cout<<"t"<<endl;
				int pos=0;
				for(int i=x;i<=y;i++)
				{
					if(a[i]<0)
					{
						pos=i;
						break;
					}
				}
				int t=1;
				int ans=-1e15;
				bool flag=0;
				for(int i=x;i<pos;i++)
				{
					t*=a[i];
					if(t>biggest)
					{
						printf("Too large\n");
						flag=1;
						break;
					}
				}
				if(flag)
					continue;
				ans=max(ans,t);
				t=1;
				for(int i=pos+1;i<=y;i++)
				{
					t*=a[i];
					if(t>biggest)
					{
						printf("Too large\n");
						flag=1;
						break;
					}
				}
				if(flag)
					continue;
				ans=max(ans,t);
				if(ans>1)
				{
					printf("%lld\n",ans);
				}
				else
					printf("1\n");
				continue;
			}
			bool flag=0;
			int ans=0;
			for(int i=x;i<=y;i++)
			{
				f1[i]=max(a[i],max(f1[i-1]*a[i],f2[i-1]*a[i]));
				f2[i]=min(a[i],min(f1[i-1]*a[i],f2[i-1]*a[i]));
				if(f1[i]>biggest)
				{
					printf("Too large\n");
					flag=1;
					break;
				}
				ans=max(ans,f1[i]);
			}
			if(!flag)
			{
				if(ans>1)
					printf("%lld\n",ans);
				else
					printf("1\n");
			}
		}
	}
	return 0;
}

2022/10/3 18:27
加载中...