zoukankan      html  css  js  c++  java
  • 阿斯顿发发顺丰

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    const int maxn=2000000;
    int add[maxn],l[maxn],r[maxn],sum[maxn],b[maxn],a[maxn];
    int n,m,len,tot,ans;
    int cop[maxn];
    
    
    /*void work(int l,int r,int z)
    {
        int mid;
        while(l<=r)
        {    
        mid=(l+r)>>1;
        if(cop[mid]<z)
        {
            l=mid+1;
        }
        else r=mid-1;
        }
        ans+=r-l+1;
    }*/
    
    
    
    void worki(int x)
    {
        for(int i=l[b[x]];i<=r[b[x]];i++)
        {
            cop[i]=a[i];
        }
        sort(cop+l[b[x]],cop+r[b[x]]+1);
    }
    
    
    int main()
    {
        scanf("%d%d",&n,&m);
        len=sqrt(n);
        tot=n/len;
        if(n%len) tot++;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            cop[i]=a[i];
            b[i]=(i-1)/len+1;
            //sum[b[i]]+=a[i];
        }
        for(int i=1;i<=tot;i++)
        {
            l[i]=(i-1)*len+1;
            r[i]=i*len;
            //sort(cop+l[i]+1,cop+r[i]+1);
            if(i==tot) r[i]=n;
        }
        
        for(int i=1;i<=tot;i++)
        {
            sort(cop+l[i],cop+r[i]+1);
        }
        for(int j=1;j<=m;j++)
        {
            char s[2];
            int x,y,z;
            scanf("%s",s);
            if(s[0]=='M')
            {
                scanf("%d%d%d",&x,&y,&z);
                
                if(b[x]==b[y])
                {
                    for(int i=x;i<=y;i++)
                    {
                        a[i]+=z;
                    }
                    worki(x);
                    continue;
                }
                for(int i=x;i<=r[b[x]];i++)
                {
                    a[i]+=z;
                    //sum[b[i]]+=z;
                    //sort(cop+x+1,cop+min(y,r[b[x]]));
                }
                for(int i=y;i>=l[b[y]];i--)
                {
                    a[i]+=z;
                    //sum[b[i]]+=z;
                    //sort(cop+max(x,l[b[y]])+1,cop+y+1);
                }
                worki(x);worki(y);
                for(int i=b[x]+1;i<=b[y]-1;i++)
                {
                    add[i]+=z;
                }
            }
            else
            {
                scanf("%d%d%d",&x,&y,&z);
                 ans=0;
                 
                 if(b[x]==b[y])
                 {
                     for(int i=x;i<=y;i++)
                     {
                         if(a[i]+add[b[i]]>=z) ans++;
                     }
                     printf("%d
    ",ans);
                     continue;
                 }
                 
                 for(int i=x;i<=r[b[x]];i++)
                 {
                     if(a[i]+add[b[i]]>=z) ans++;
                 }
                 
                 for(int i=y;j>=l[b[y]];i--)
                 {
                     if(a[i]+add[b[i]]>=z) ans++;
                 }
                //work(x,min(y,r[b[x]]),z);
                //work(max(x,l[b[y]]),y,z);
                for(int i=b[x]+1;i<=b[y]-1;i++)
                {
                     int d=lower_bound(a+l[i],a+r[i]+1,z-add[i])-a;
                    ans+=r[i]-d+1;
                    //work(l[i],r[i],z);
                }
                printf("%d
    ",ans);
            }
        }
        
        
        return 0;
    }
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int maxn=1000000;
    struct node
    {
        int l,r,id;
    }qu[maxn];
    int n,q,a[maxn];
    int len,tot,b[maxn];
    int cnt[maxn],ll=1,rr=0,now=0;
    bool cmp(node x,node y)
    {
        if(b[x.l]==b[y.l]) return x.r<y.r;
        else return x.l<y.l;
    }
    /*int cmp(node x,node y) {
        return (b[x.l] ^ b[y.l]) ? b[x.l] < b[y.l] : ((b[x.l] & 1) ? x.r < y.r : x.r > y.r);
    }*/
    
    void add(int pos)
    {
        if(!cnt[a[pos]]) ++now;
        ++cnt[a[pos]];
    }
    
    void del(int pos)
    {
        --cnt[a[pos]];
        if(!cnt[a[pos]]) now--;
    }
    
    int ans[maxn];
    int main()
    {
        scanf("%d",&n);
        len=sqrt(n);
        tot=n/len;
        if(n%len) tot++;
        
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            b[i]=(i-1)/len+1;
        }
        
        scanf("%d",&q);
        for(int i=1;i<=q;i++)
        {
            scanf("%d%d",&qu[i].l,&qu[i].r);
    #include<cstdio>
    #include<cstring>
    #include<cmath> 
    #include<algorithm>
    using namespace std;
    const int maxn=200000;
    int n,m;
    int a[maxn],l[maxn],r[maxn],b[maxn],sum[maxn];
    int len,tot,add[maxn];
    
    int main()
    {
        scanf("%d%d",&n,&m);
         len=sqrt(n);//区间长度 
         tot=n/len;//区间个数 
         if(n%len) tot++;
         for(int i=1;i<=n;i++)
         {
             scanf("%d",&a[i]);
             b[i]=(i-1)/len+1;//隶属哪一块 
             sum[b[i]]+=a[i];//区间总和 
         }
         for(int i=1;i<=tot;i++)
         {
             l[i]=(i-1)*len+1;//区间左右端点 
             r[i]=i*len;
         }
         
         for(int i=1;i<=m;i++)
         {
             int q,x,y,k;
             scanf("%d",&q);
             if(q==1)
             {
                 scanf("%d%d%d",&x,&y,&k);
                 for(int j=x;j<=min(y,r[b[x]]);j++)
                 {
                     a[j]+=k;
                     sum[b[j]]+=k;
                 }
                 for(int j=y;j>=max(x,l[b[y]]);j--)
                 {
                     a[j]+=k;
                     sum[b[j]]+=k;
                 }
                 for(int j=b[x]+1;j<=b[y]-1;j++)
                 {
                     add[j]+=k;
                 }
             }
             else if(q==2)
             {
                 long long ans=0;
                 scanf("%d%d",&x,&y);
                 for(int j=x;j<=min(y,r[b[x]]);j++)
                 {
                     ans+=a[j]+add[b[j]];
                 }
                 for(int j=y;j>=max(x,l[b[y]]);j--)
                 {
                     ans+=a[j]+add[b[j]];
                 }
                 for(int j=b[x]+1;j<=b[y]-1;j++)
                 {
                     ans+=sum[j]+add[j]*(r[j]-l[j]+1);
                 }
                 if(b[x]==b[y])
                 {
                     ans-=a[x]+a[y]+add[b[x]]+add[b[y]];
                 }
                 printf("%lld
    ",ans);
             }
         } 
        
        return 0;
    }
    
    
    
          qu[i].id=i;
        }
        sort(qu+1,qu+q+1,cmp);
        for(int i=1;i<=q;i++)
        {
            int ql=qu[i].l;
            int qr=qu[i].r;
            while(ll<ql) del(ll++);
            while(ll>ql) add(--ll);
            while(rr>qr) del(rr--);
            while(rr<qr) add(++rr);
            ans[qu[i].id]=now; 
        }
        for(int i=1;i<=q;i++) printf("%d
    ",ans[i]);
        return 0;
    }
  • 相关阅读:
    L161
    L160
    L159
    PyQt编程实战:画出QScrollArea的scrollAreaWidgetContents内容部署层的范围矩形
    PyQt(Python+Qt)学习随笔:QScrollArea滚动区域layout布局的作用及设置方法
    PyQt(Python+Qt)学习随笔:QScrollArea滚动区域的scrollAreaWidgetContents、widget及setWidget等相关概念解释
    PyQt(Python+Qt)学习随笔:怎么在QScrollArea滚动区域中展示子部件的超长内容?
    PyQt(Python+Qt)学习随笔:QScrollArea的widgetResizable属性
    PyQt(Python+Qt)学习随笔:QScrollArea的alignment属性不起作用的原因
    第二十四章、containers容器类部件QScrollArea滚动区域详解
  • 原文地址:https://www.cnblogs.com/WHFF521/p/11178550.html
Copyright © 2011-2022 走看看