求区间最大积(单点绝对值大于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;
}
}
}
}
}