10分求调
  • 板块P8563 Magenta Potion
  • 楼主BantM
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/10/16 18:51
  • 上次更新2023/10/27 07:13:37
查看原帖
10分求调
389729
BantM楼主2022/10/16 18:51

求区间最大积(单点绝对值大于2)(若大于pow(2,30)输出“大数”)

思路很简单,就是先记录下区间内负数的数量

如果为偶数显然答案为所有数承起来

如果为奇数就是分别从最前的负数往后乘到r,和从r乘到最后的负数,结果取max

样例过了,题目底下给的额外样例1也过了(样例2太大不会用),应该是小错误,求调

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,q;
int a[1021];
int poww(int a,int b){
	int ans=1;
	while(b){
		if(b&1){
			ans*=a;
		}
		a*=a;
		b=b>>1;
	}
	return ans;
}
const int b=poww(2,30);
int aabs(int a){
	if(a<0){
		return -a;
	} 
	else{
		return a;
	}
}
signed main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int f;
	int ii,k;
	int l,r;
	for(int i=1;i<=q;i++){
		cin>>f;
		ll ans=1;
		if(f==1){
			cin>>ii>>k;
			a[ii]=k;
		}
		else{
			cin>>l>>r;
			if(r-l+1>=65){
				cout<<"Too large"<<endl;
			}	
			else{
				if(l==r&&a[l]<0){
					cout<<1<<endl;
					continue;
				}
				int t=0;
				for(int i=l;i<=r;i++){
					if(a[i]<0){
						t++;
					}
				}
				if(!(t&1)){
					for(int i=l;i<=r;i++){
						ans*=aabs(a[i]);			
					}
					if(ans<=b){
						cout<<ans<<endl;
					}
					else{
						cout<<"Too large"<<endl;
					}

					ans=1;
				}
				else{
					int t1=0;
					for(int i=l;i<=r;i++){
						if(a[i]<0){
							t1=i;
							break;
						}
					}
					int t2=0;
					for(int i=r;i>=l;i--){
						if(a[i]<0){
							t2=i;
							break;
						}
					}
					ll ans1=1;
					for(int i=t1+1;i<=r;i++){
						ans1*=aabs(a[i]);
					}
					ll ans2=1;
					for(int i=l;i<=t2-1;i++){
						ans2*=aabs(a[i]);
					}
					if(ans1<=b&&ans2<=b)
						cout<<max(ans1,ans2)<<endl;
					else
						cout<<"Too large"<<endl;
					ans=1;
					ans1=1;
					ans2=1;
				}
			}
			
		}
	}
}
2022/10/16 18:51
加载中...