zoukankan      html  css  js  c++  java
  • 教主的魔法

      草稿

    #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);
        }
    }
  • 相关阅读:
    (数学)Knight's Trip -- hdu -- 3766
    (DP 雷格码)Gray code -- hdu -- 5375
    (简单匹配)Card Game Cheater -- hdu --1528
    (数论)LightOJ -- 1245
    (树状数组+离散化)lines--hdu --5124
    01项目需要用到的jquery函数介绍
    jdbc基础
    基础加强
    jdbc
    01-1项目所需小工具
  • 原文地址:https://www.cnblogs.com/chen74123/p/6875733.html
Copyright © 2011-2022 走看看