比赛 树形数据结构进阶(再进阶) 评测结果 RRRRRRRRRRRRRRRRRRRR
题目名称 区间 最终得分 0
用户昵称 htl 运行时间 0.058 s
代码语言 C++ 内存使用 3.33 MiB
提交时间 2025-04-19 11:14:43
显示代码纯文本
#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((l-1)/316+1>=(r+1)/316-1)
            {
            for(int i=l;i<=r;i++)
            {
                for(int j=0;j<30;j++)
                {
                    if(t[j]-a[i/316][i%316]>=0)
                        b[(l-1)/316][t[j]-a[i/316][i%316]]--;
                    if(t[j]-a[i/316][i%316]-d>=0)
                        b[(l-1)/316][t[j]-a[i/316][i%316]-d]++;
                }
            }
            }
            else
            {
            for(int i=(l-1)/316+1;i<=(r+1)/316-1;i++)
            {
                c[i]+=d;
            }
            
            for(int i=l;i<((l-1)/316+1)*316;i++)
            {
                for(int j=0;j<30;j++)
                {
                    if(t[j]-a[i/316][i%316]>=0)
                        b[(l-1)/316][t[j]-a[i/316][i%316]]--;
                    if(t[j]-a[i/316][i%316]-d>=0)
                        b[(l-1)/316][t[j]-a[i/316][i%316]-d]++;
                }
            }
            for(int i=((r+1)/316-1)*316+316;i<=r;i++)
            {
                for(int j=0;j<30;j++)
                {
                    if(t[j]-a[i/316][i%316]>=0)
                        b[(r+1)/316][t[j]-a[i/316][i%316]]--;
                    if(t[j]-a[i/316][i%316]-d>=0)
                        b[(r+1)/316][t[j]-a[i/316][i%316]-d]++;
                }
            }
            }
            
        }
        else
        if(str=="count")
        {
            int ans=0;
            
            if((l-1)/316+1>=(r+1)/316-1)
            {
            for(int i=l;i<=r;i++)
            {
                for(int j=0;j<30;j++)
                {
                   if(a[i/316][i%316]+c[(l-1)/316+1]==t[j])
                   {
                       ans++;
                       break;
                   }
                }
            }
            }
            else
            {
            for(int i=(l-1)/316+1;i<=(r+1)/316-1;i++)
            {
                ans+=b[i][c[i]];
            }
            for(int i=l;i<((l-1)/316+1)*316;i++)
            {
                for(int j=0;j<30;j++)
                {
                   if(a[i/316][i%316]+c[(l-1)/316+1]==t[j])
                   {
                       ans++;
                       break;
                   }
                }
            }
            for(int i=((r+1)/316-1)*316+316;i<=r;i++)
            {
                for(int j=0;j<30;j++)
                {
                   if(a[i/316][i%316]+c[(r+1)/316-1]==t[j])
                   {
                       ans++;
                       break;
                   }
                }
            }
            }
            cout<<ans<<endl;
        }
    }
    return 0;
}