MnZn 初学OI求助 吸氧#1#3 RE 不吸#1 TLE #3 WA
  • 板块P1805 关灯
  • 楼主Sir_en
  • 当前回复22
  • 已保存回复22
  • 发布时间2022/10/19 16:27
  • 上次更新2023/11/16 17:46:44
查看原帖
MnZn 初学OI求助 吸氧#1#3 RE 不吸#1 TLE #3 WA
665463
Sir_en楼主2022/10/19 16:27

RT 结构体中数组开大(1500左右)还CE

#include <bits/stdc++.h>

using namespace std;

class number {
    public:
    int length=1;
    int a[1250]={0};
};
number on[1250],off[1250],sum;

number add,times;

number operator + (const number &x,const number &y)
{
    int l=max (x.length,y.length);

    number ans;
    ans.length=l;

    int c=0;
    for (int i=1;i<=l;++i)
    {
        ans.a[i]=x.a[i]+y.a[i]+c;

        if (ans.a[i]>=10)
        {
            c=1;
            ans.a[i]-=10;
        }
        else c=0;
    }

    if (c)
    {
        ans.length++;
        ans.a[ans.length]=1;
    }

    return ans;
}

number operator * (const number &x,const number &y)
{
    number ans;                             
    ans.length=x.length+y.length+1;       

    for(int i=1;i<=x.length;i++)       
        for(int j=1;j<=y.length;j++)
            ans.a[i+j-1]+=x.a[i]*y.a[j]; 

    for (int i=1;i<=ans.length;i++)     
    {
        if(ans.a[i]>=10)
        {
            ans.a[i+1]+=ans.a[i]/10;
            ans.a[i]%=10;             
            ans.length=max(ans.length,i+1);
        }
    }

    return ans;
}

int light[1050];

void write (number x)
{
   while (not x.a[x.length] and x.length>1) 
    	x.length--;
    
    for (int i=x.length;i>=1;--i)   
    	printf ("%d",x.a[i]);
}

int main ()
{
    int n;
    scanf ("%d",&n);

    add.a[1]=1;
    times.a[1]=2;
    
    for (int i=1;i<=n;++i) 
    	scanf ("%d",&light[i]);

    if (light[1])   
    {
        off[1].a[1]=1;
        on[1].a[1]=0;
    }
    else 
    {
        off[1].a[1]=0;
        on[1].a[1]=1;
    }

    for (int i=2;i<=n;++i)
    {
        if (light[i])
        {
            off[i]=(on[i-1]*times)+add;

            for (int j=i-2;j>=1;--j)
            off[i]=off[i]+(off[j]*times);
        }
        else
        {
            on[i]=(on[i-1]*times)+add;

            for (int j=i-2;j>=1;--j)
            on[i]=on[i]+(off[j]*times);   
        }
    }
   

    for (int i=1;i<=n;++i)  sum=sum+off[i];

    write (sum);

    return 0;
}
2022/10/19 16:27
加载中...