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

    Time Limit: 10 Sec  Memory Limit: 256 MB
    Submit: 1137  Solved: 508

    Description

    教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1、2、……、N
    每个人的身高一开始都是不超过1000的正整数。教主的魔法每次可以把闭区间[LR](1≤LRN)内的英雄的身高全部加上一个整数W。(虽然L=R时并不符合区间的书写规范,但我们可以认为是单独增加第LR)个英雄的身高)
    CYZ、光哥和ZJQ等人不信教主的邪,于是他们有时候会问WD闭区间 [LR] 内有多少英雄身高大于等于C,以验证教主的魔法是否真的有效。
    WD巨懒,于是他把这个回答的任务交给了你。
     

    Input

           第1行为两个整数NQQ为问题数与教主的施法数总和。
           第2行有N个正整数,第i个数代表第i个英雄的身高。
           第3到第Q+2行每行有一个操作:
    (1)       若第一个字母为“M”,则紧接着有三个数字LRW。表示对闭区间 [LR] 内所有英雄的身高加上W
    (2)       若第一个字母为“A”,则紧接着有三个数字LRC。询问闭区间 [LR] 内有多少英雄的身高大于等于C
     

    Output

           对每个“A”询问输出一行,仅含一个整数,表示闭区间 [LR] 内身高大于等于C的英雄数。
     

    Sample Input

    5 3
    1 2 3 4 5
    A 1 5 4
    M 3 5 1
    A 1 5 4

    Sample Output

    2
    3

    HINT

    【输入输出样例说明】

    原先5个英雄身高为1、2、3、4、5,此时[1, 5]间有2个英雄的身高大于等于4。教主施法后变为1、2、4、5、6,此时[1, 5]间有3个英雄的身高大于等于4。

     

    【数据范围】

    对30%的数据,N≤1000,Q≤1000。

    对100%的数据,N≤1000000,Q≤3000,1≤W≤1000,1≤C≤1,000,000,000。

    Source

    不知阁下是哪里的教主?

    按区间分块。

    在每块内开一个排序后的数组,方便二分查找。

    每次修改时,中间整块整体加一个修改标记,两边小块的值直接修改,并且重新排序。

    每次询问时同理,中间整块挨个二分查找,两边暴力查询。

    长期被手写二分困扰的我选择了lower_bound

     1 /*by SilverN*/
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 #include<vector>
     8 using namespace std;
     9 const int mxn=1000010;
    10 int read(){
    11     int x=0,f=1;char ch=getchar();
    12     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    13     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    14     return x*f;
    15 }
    16 int block,cnt;
    17 int L[mxn],R[mxn];
    18 int belone[mxn];
    19 int a[mxn];//原数组 
    20 int k[mxn];//排序数组 
    21 int f[1010];//块内身高修改量 
    22 int n,q;
    23 int query(int l,int r,int c){//查询 
    24     int ql=belone[l];
    25     int qr=belone[r];
    26     ql++;qr--;
    27     int ans=0;
    28     int i;
    29 //    printf("si: %d %d
    ",ql,qr);
    30     for(i=ql;i<=qr;i++){
    31         int tmp=lower_bound(k+L[i],k+R[i]+1,c-f[i])-k;
    32         ans+=R[i]-tmp+1;
    33     }
    34 //    printf("ask_test: L:%d R:%d ans:%d
    ",l,r,ans);
    35     ql--;qr++;
    36     for(i=l;i<=R[ql];++i)if(a[i]>=c)ans++;
    37     for(i=L[qr];i<=r;++i)if(a[i]>=c)ans++;
    38     return ans;
    39 }
    40 void change(int l,int r,int w){//改变 
    41     int ql=belone[l]+1;
    42     int qr=belone[r]-1;
    43     int i,j;
    44     for(i=ql;i<=qr;i++){ f[i]+=w; }
    45     //处理区间 
    46     ql--;qr++;
    47     for(i=l;i<=R[ql];++i)a[i]+=w;
    48     for(i=L[ql];i<=R[ql];++i)k[i]=a[i];
    49     sort(k+L[ql],k+R[ql]+1);
    50     //处理左边 
    51     for(i=L[qr];i<=r;i++) a[i]+=w;
    52     for(i=L[qr];i<=R[qr];++i)k[i]=a[i];
    53     sort(k+L[qr],k+R[qr]+1);
    54     //处理右边 
    55     return;
    56 }
    57 int main(){
    58     n=read();q=read();
    59     block=sqrt(n);
    60     cnt=(n-1)/block+1;
    61     int i,j;
    62     for(i=1;i<=n;i++){
    63         a[i]=read();
    64         belone[i]=(i-1)/block+1;
    65     }
    66     for(i=1;i<=cnt;i++){
    67         L[i]=R[i-1]+1;
    68         R[i]=i*block;
    69     }
    70     R[cnt]=min(n,R[cnt]);
    71     memcpy(k,a,sizeof k);
    72     for(i=1;i<=cnt;i++){
    73         sort(k+L[i],k+R[i]+1);
    74     }
    75     char op[5];
    76     int l,r,w;
    77     while(q--){
    78         scanf("%s",op);
    79         l=read();r=read();w=read();
    80         if(op[0]=='M'){
    81             change(l,r,w);
    82         }
    83         else{
    84             int ans=query(l,r,w);
    85             printf("%d
    ",ans);
    86         }
    87     }
    88     return 0;
    89 }
  • 相关阅读:
    结对第一次—原型设计(文献摘要热词统计)
    第一次作业-准备篇
    软件工程实践总结
    团队作业第二次—项目选题报告
    软工实践|结对第二次—文献摘要热词统计
    软工实践|结对第一次—原型设计(文献摘要热词统计)
    第一次作业-准备篇
    个人作业——软件工程实践总结作业
    团队作业第二次——项目选题报告
    结对第二次—文献摘要热词统计
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5981750.html
Copyright © 2011-2022 走看看