55分求调,没用线段树(代码很简单的!)
查看原帖
55分求调,没用线段树(代码很简单的!)
667622
lcokil楼主2022/10/23 09:05
RT,有六个点WA了不知道是为什么()
具体思路都写在代码里了

这个人好像经常写一些bug

#include <bits/stdc++.h>
using namespace std;
long long a[100000000];
void find(int l,int r)
{
    long long ans=1,ans2=1;
    int s1=r,s2,cnt=0;
    //cnt记录负数个数 
    for(int i=l;i<=r;i++)
        if(a[i]<0)
            cnt++;
    if(cnt%2==0)     // 负数个数为偶数时 最大的值就是所有数之积 
    {
        for(int i=l;i<=r;i++)
        {
            ans*=a[i];
            if(ans>1073741824)
            {
                cout<<"Too large"<<endl;
                return;
            }
        }
    }
    else             // 负数个数为奇数时 
    {
        for(int i=l;i<=r;i++)
            if(a[i]<0)
            {
                s1=i;
                break;
            }   // s1存第一个负数位置,S2存第二个负数位置 
        for(int i=r;i>=l;i--)
            if(a[i]<0)
            {
                s2=i;
                break;
            } 
        for(int i=s1+1;i<=r;i++)    //舍去第一个负数之前的所有数之积
        {
            ans*=a[i];
            if(ans>1073741824)
            {
                cout<<"Too large"<<endl;
                return;
            }
        }
        for(int i=l;i<s2;i++)   //舍去最后一个负数之后的所有数之积 
        {
            ans2*=a[i];
            if(ans2>1073741824)
            {
                cout<<"Too large"<<endl;
                return;
            }
        }
    }
    cout<<max(ans,ans2)<<endl;
    return;
}
int main()
{
//  freopen("T1ex2.in","r",stdin);
//  freopen("T1ex2.out","w",stdout);
    int n,q,m,c,b,j;
    long long k;
    //shuru
    cin>>n>>q;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=q;i++)
    {
        cin>>m;
    //1
        if(m==1)
        {
            cin>>j>>k;
            a[j]=k;
        } 
        else
        {
    //2 
            cin>>c>>b;
            find(c,b);
        }
    }
    return 0;
} 
2022/10/23 09:05
加载中...