比赛 树形数据结构进阶(再进阶) 评测结果 AAWAAWWAWWWWWWWWWWWWA
题目名称 幸运数列 最终得分 29
用户昵称 htl 运行时间 19.551 s
代码语言 C++ 内存使用 8.06 MiB
提交时间 2025-04-19 11:59:55
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[320][316];
int b[320][10010];
int c[320];
int t[30]={
4,7,
44,47,74,77,
444,447,474,477,744,747,774,777,
4444,4447,4474,4477,4744,4747,4774,4777,7444,7447,7474,7477,7744,7747,7774,7777
};
int main()
{
    freopen("cf121e.in","r",stdin);
    freopen("cf121e.out","w",stdout);
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        cin>>a[i/316][i%316];
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<30;j++)
        {
            if(t[j]-a[i/316][i%316]>=0)
                b[i/316][t[j]-a[i/316][i%316]]++;
        }
    }
    string str;
    int l,r,d;
    while(m--)
    {
        cin>>str;
        cin>>l>>r;
        l--,r--;
        if(str=="add")
        {
            cin>>d;
            
            if(((r)/316-1)-((l)/316+1)<=2)
            {
            for(int i=l;i<=r;i++)
            {
                for(int j=0;j<30;j++)
                {
                    if(t[j]-a[i/316][i%316]>=0)
                        b[(i)/316][t[j]-a[i/316][i%316]]--;
                    if(t[j]-a[i/316][i%316]-d>=0)
                        b[(i)/316][t[j]-a[i/316][i%316]-d]++;
                }
            }
            }
            else
            {
            for(int i=(l)/316+1;i<=(r)/316-1;i++)
            {
                c[i]+=d;
            }
            
            for(int i=l;i<((l)/316+1)*316;i++)
            {
                for(int j=0;j<30;j++)
                {
                    if(t[j]-a[i/316][i%316]>=0)
                        b[(i)/316][t[j]-a[i/316][i%316]]--;
                    if(t[j]-a[i/316][i%316]-d>=0)
                        b[(i)/316][t[j]-a[i/316][i%316]-d]++;
                }
            }
            for(int i=((r)/316-1)*316+316;i<=r;i++)
            {
                for(int j=0;j<30;j++)
                {
                    if(t[j]-a[i/316][i%316]>=0)
                        b[(i)/316][t[j]-a[i/316][i%316]]--;
                    if(t[j]-a[i/316][i%316]-d>=0)
                        b[(i)/316][t[j]-a[i/316][i%316]-d]++;
                }
            }
            }
            
        }
        else
        if(str=="count")
        {
            int ans=0;
            
            if(((r)/316-1)-((l)/316+1)<=2)
            {
            for(int i=l;i<=r;i++)
            {
                for(int j=0;j<30;j++)
                {
                   if(a[i/316][i%316]+c[(i)/316]==t[j])
                   {
                       ans++;
                       break;
                   }
                }
            }
            }
            else
            {
            for(int i=(l)/316+1;i<=(r)/316-1;i++)
            {
                ans+=b[i][c[i]];
            }
            for(int i=l;i<((l)/316+1)*316;i++)
            {
                for(int j=0;j<30;j++)
                {
                   if(a[i/316][i%316]+c[(i)/316]==t[j])
                   {
                       ans++;
                       break;
                   }
                }
            }
            for(int i=((r)/316-1)*316+316;i<=r;i++)
            {
                for(int j=0;j<30;j++)
                {
                   if(a[i/316][i%316]+c[(i)/316]==t[j])
                   {
                       ans++;
                       break;
                   }
                }
            }
            }
            cout<<ans<<endl;
        }
    }
    return 0;
}