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。
 
题解
这个题卡了半个下午,因为我太粗心QwQ
分块求解。
整块的做另外一个排好序的数组,不整块的暴力修改。修改时一定要注意修改整个块,而不是只修改对应数组的值(此时他们已经不一一对应了)
代码特别丑
 #include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
const int maxn=;
struct aa{int num,tag,h,block;}a[maxn];
int c[maxn];
int mid,b[maxn],n,q,tot,l,r,w;
using namespace std;
void add(int l,int r,int w){//这里写毁了
int zuo=a[l].h,you=a[r].h;
if (a[l].block*mid>=r) {for (int i=l;i<=r;i++) a[i].num+=w;
for (int i=(a[zuo].block-)*mid+;i<=a[zuo].block*mid;i++) c[i]=a[i].num;
sort(c+(a[l].block-)*mid+,c+a[l].block*mid+);return;}
for (int i=l;i<=a[l].block*mid;i++)a[i].num+=w;
for (int i=(a[zuo].block-)*mid+;i<=a[zuo].block*mid;i++) c[i]=a[i].num;
sort(c+(a[l].block-)*mid+,c+a[l].block*mid+);
for(int i=(a[r].block-)*mid+;i<=r;i++) a[i].num+=w;
for (int i=(a[you].block-)*mid+;i<=a[you].block*mid;i++) c[i]=a[i].num;
sort(c+(a[r].block-)*mid+,c+a[r].block*mid+);
for (int i=a[l].block+;i<=a[r].block-;i++)
a[(i-)*mid+].tag+=w;
} int find1(int l,int r,int c){
for (int i=l;i<=r;i++) b[i]=a[i].num; b[r+]=;
sort(b+l,b+r+);
int x=lower_bound(b+l,b+r+,c)-b;
return r-x+;
} int find2(int l,int r,int d){
int x=lower_bound(c+l,c+r+,d)-c;
return r-x+;
} int query(int l,int r,int d){
int zuo=a[l].h,you=a[r].h;
int ans=;
if (a[l].block*mid>=r) return find1(l,r,d-a[zuo].tag);
ans+=find1(l,a[l].block*mid,d-a[zuo].tag);
for (int i=a[l].block+;i<=a[r].block-;i++)
ans+=find2((i-)*mid+,i*mid,d-a[(i-)*mid+].tag);
ans+=find1((a[r].block-)*mid+,r,d-a[you].tag);
return ans;
} int main(){
freopen("magic.txt","r",stdin);
freopen("me.txt","w",stdout);
char ch[];
scanf("%d%d",&n,&q);
mid=(int)sqrt(n)+;
for (int i=;i<=n;i++) scanf("%d",&a[i].num),c[i]=a[i].num;
for (int i=;i<=n;i++)if (tot*mid>=i) a[i].block=tot,a[i].h=a[i-].h;else a[i].block=++tot,a[i].h=i;
for (int i=;i<=tot;i++)
sort(c+(i-)*mid+,c+i*mid+);
for (int j=;j<q;j++){
scanf("%s%d%d%d",&ch,&l,&r,&w);
switch(ch[]){
case 'M':add(l,r,w);break;
case 'A':printf("%d\n",query(l,r,w)); break;
}
}
}

BZOJ 3343教主的魔法的更多相关文章

  1. BZOJ 3343: 教主的魔法(分块+二分查找)

    BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved:  ...

  2. BZOJ 3343: 教主的魔法 [分块]【学习笔记】

    3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved: 526[Submit][Status][Discus ...

  3. Bzoj 3343: 教主的魔法 分块,二分

    3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 821  Solved: 364[Submit][Status][Discuss ...

  4. Bzoj 3343: 教主的魔法(分块+二分答案)

    3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...

  5. BZOJ——3343: 教主的魔法 || 洛谷—— P2801 教主的魔法

    http://www.lydsy.com/JudgeOnline/problem.php?id=3343  ||  https://www.luogu.org/problem/show?pid=280 ...

  6. bzoj 3343: 教主的魔法

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 924  Solved: 402[Submit][Status][Discuss] Descriptio ...

  7. bzoj 3343 教主的魔法 分块

    修改直接对整块打标记,两边暴力. 查询需要保证每个整块有序,所以在修改时排序就好啦 #include<cstdio> #include<cstring> #include< ...

  8. [bzoj] 3343 教主的魔法 || 带修改分块

    原题 长度为n的序列,有两种操作: 1.[l,r]区间每个数+w 2.询问[l,r]区间有多少个数>c 记录lazy数组即可. #include<cstdio> #include&l ...

  9. 块状链表 bzoj 3343教主的魔法

    //块状链表//分块排序,然后每次查找时在暴力查找头和尾两个块.//中间那些块,因为有序所以只需2分查找即可.我用的是lower_pound();//插入是,也是头和尾暴力插入,中间那些加到一个累计里 ...

随机推荐

  1. Bleed Brake Master Cylinder with Intelligent Tester IT2

    When the brake fluid level drops too low in the master cylinder reservoir, air bubbles can get caugh ...

  2. Windows2012中安装Nginx并创建为Windows服务

    安装Nginx 下载windows版nginx (http://nginx.org/download/nginx-1.10.0.zip),之后解压到需要放置的位置(D:\xampp\nginx) 将N ...

  3. /lib /usr/lib /usr/local/lib 区别

    简单说,/lib是内核级的,/usr/lib是系统级的,/usr/local/lib是用户级的. /lib/ — 包含许多被 /bin/ 和 /sbin/ 中的程序使用的库文件.目录 /usr/lib ...

  4. Java系统程序员修炼之道

    一:Java语言学习 对线程(thread),串行化,反射,网络编程,JNI技术,容器(Map,List, Iterator), 类加载器 (ClassLoader),输入输出流,垃圾回收机制, 有比 ...

  5. windows7 图形界面远程 centos6.5

    一.首先确定centos已经安装了gnome,因为centos自身没有图形界面,别说远程图形界面方式访问了,就本地图像界面方式都不行 1.首先查看系统的运行级别以及是否安装了桌面环境    1.使用命 ...

  6. otf字体转ttf字体

    可以使用Font creator进行转换字体. 绿色版下载链接 Font Creator(字体编辑软件下载)V9.0官方版 或者我的百度云:http://pan.baidu.com/s/1c1jjfm ...

  7. android之手动安装apk到模拟器

    一.将apk放到SDK的指定路径 二.打开命令行 三.安装apk到模拟器 此处遇到无法找到主机,解决办法: 发现是进程2512堵塞导致的 进入powershell 查看进程 发现2512进程是360手 ...

  8. JavaScript入门(10)

    一.Window对象 window对象是BOM的核心,window对象指当前的浏览器窗口 window对象方法 二.JavaScript计时器 在JavaScript中,我们可以在设定的时间间隔之后来 ...

  9. MYSQL之性能优化 ----MySQL性能优化必备25条

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数 ...

  10. PHP的几个特殊符号意义

    有些特殊符号需要特殊记忆,希望对你的编程有帮助! 方法/步骤 1 $ 这个符号的意思是:变量 2 & 这个符号的意思是:变量的地址(加在变量前) 3 @ 这个符号的意思是:不显示错误信息(加在 ...