• 教主的魔法


      草稿

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1000006;
    int n,m,num,belong[maxn],block,l[maxn],r[maxn],a[maxn],p[maxn];
    int d[maxn];
    //num分块的个数
    //belong[i]表示i属于哪一块
    //block表示块的大小
    //l[i]表示i这块的左端点位置
    //r[i]表示右端点位置
    void build()
    {
        block=sqrt(n);
        num=n/block;
        if(n%block)num++;
        for(int i=1; i<=num; i++)    l[i]=(i-1)*block+1,r[i]=i*block;
        r[num]=n;
        for(int i=1; i<=n; i++)    belong[i]=(i-1)/block+1;
        for(int i=1; i<=n; i++)    d[i]=a[i];
        for(int i=1; i<=num; i++)    sort(d+l[i],d+r[i]+1);
    }
    char op[5];
    int A,B,C;
    void update(int L,int R,int W)
    {
        if(belong[L]==belong[R])
        {
            for(int i=l[belong[L]]; i<=r[belong[R]]; i++)    a[i]+=p[belong[L]];
            p[belong[L]]=0;
            for(int i=L; i<=R; i++)    a[i]+=W;
            for(int i=l[belong[L]]; i<=r[belong[R]]; i++)    d[i]=a[i];
            sort(d+l[L],d+r[R]+1);
            return;
        }
        for(int i=l[belong[L]]; i<=r[belong[L]]; i++)    a[i]+=p[belong[L]];
        p[belong[L]]=0;
        for(int i=L; i<=r[belong[L]]; i++)    a[i]+=W;
        for(int i=l[belong[L]]; i<=r[belong[L]]; i++)    d[i]=a[i];
        sort(d+l[belong[L]],d+r[belong[L]]+1);
        for(int i=l[belong[R]]; i<=r[belong[R]]; i++)    a[i]+=p[belong[R]];
        p[belong[R]]=0;
        for(int i=l[belong[R]]; i<=R; i++)    a[i]+=W;
        for(int i=l[belong[R]]; i<=r[belong[R]]; i++)    d[i]=a[i];
        sort(d+l[belong[R]],d+r[belong[R]]+1);
        for(int i=belong[L]+1; i<belong[R]; i++)    p[i]+=W;
    }
    void ask(int L,int R,int W)
    {
        int ans=0;
        if(belong[L]==belong[R])
        {
            for(int i=L; i<=R; i++)
                if(a[i]+p[belong[i]]>=W)    ans++;
            printf("%d
    ",ans);
            return;
        }
        for(int i=L; i<=r[belong[L]]; i++)    if(a[i]+p[belong[i]]>=W) ans++;
        for(int i=l[belong[R]]; i<=R; i++)    if(a[i]+p[belong[i]]>=W) ans++;
        for(int i=belong[L]+1; i<belong[R]; i++)
        {
            int ll=l[i],rr=r[i],Ans=0;
            while(ll<=rr)
            {
                int mid=(ll+rr)/2;
                if(d[mid]+p[i]>=W)rr=mid-1,Ans=r[i]-mid+1;
                else ll=mid+1;
            }
            ans+=Ans;
        }
        printf("%d
    ",ans);
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1; i<=n; i++)    scanf("%d",&a[i]); build();
        for(int i=1; i<=m; i++)
        {
            scanf("%s%d%d%d",&op,&A,&B,&C);
            if(op[0]=='A')ask(A,B,C);
            else update(A,B,C);
        }
    }
  • 相关阅读:
    LightOJ 1245(Harmonic Number (II))
    牛客练习赛13 乌龟跑步(DP)
    vue-cli 打包编译 -webkit-box-orient: vertical 被删除解决办法
    vue静态文件处理
    vue项目关闭eslint检查
    Mac 桌面软件开发基础问答
    Mac App开发
    mac os app 开发
    vue中html模板使用绑定的全局函数
    软件版本标识
  • 原文地址:https://www.cnblogs.com/chen74123/p/6875733.html
Copyright © 2020-2023  润新知