*题目描述:
教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1、2、……、N。
每个人的身高一开始都是不超过1000的正整数。教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W。(虽然L=R时并不符合区间的书写规范,但我们可以认为是单独增加第L(R)个英雄的身高)
CYZ、光哥和ZJQ等人不信教主的邪,于是他们有时候会问WD闭区间 [L, R] 内有多少英雄身高大于等于C,以验证教主的魔法是否真的有效。
WD巨懒,于是他把这个回答的任务交给了你。
*输入:
第1行为两个整数N、Q。Q为问题数与教主的施法数总和。第2行有N个正整数,第i个数代表第i个英雄的身高。
第3到第Q+2行每行有一个操作:
(1) 若第一个字母为“M”,则紧接着有三个数字L、R、W。表示对闭区间 [L, R] 内所有英雄的身高加上W。
(2) 若第一个字母为“A”,则紧接着有三个数字L、R、C。询问闭区间 [L, R] 内有多少英雄的身高大于等于C。
*输出:
对每个“A”询问输出一行,仅含一个整数,表示闭区间 [L, R] 内身高大于等于C的英雄数。
*样例输入:
5 3
1 2 3 4 5
A 1 5 4
M 3 5 1
A 1 5 4
*样例输出:
2
3
*提示:
【输入输出样例说明】
原先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。
*题解:
分块,块内是有序的,然后每次查询的话如果在同一块就暴力查,不在同一块就两边暴力,中间在块内二分(lower_bound大法好~)。区间修改的话和查询差不多,残缺的块就暴力加完重构,完整的块直接打上标记(标记永久化)。
*代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath> #ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif #ifdef CT
#define debug(...) printf(__VA_ARGS__)
#define setfile()
#else
#define debug(...)
#define filename ""
#define setfile() freopen(filename".in", "r", stdin); freopen(filename".out", "w", stdout);
#endif #define R register
#define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T) ? EOF : *S++)
#define dmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
#define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
#define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
#define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
char B[1 << 15], *S = B, *T = B;
inline int FastIn()
{
R char ch; R int cnt = 0; R bool minus = 0;
while (ch = getc(), (ch < '0' || ch > '9') && ch != '-') ;
ch == '-' ? minus = 1 : cnt = ch - '0';
while (ch = getc(), ch >= '0' && ch <= '9') cnt = cnt * 10 + ch - '0';
return minus ? -cnt : cnt;
}
#define maxn 1000010
#define maxsize 4010
int a[maxn], b[maxn], block, id[maxn], n, q, ans, w, tag[maxsize];
inline void build(R int x)
{
R int l = x * block, r = (x + 1) * block - 1;
cmin(r, n);
for (R int i = l; i <= r; ++i) b[i] = a[i];
std::sort(b + l, b + r + 1);
}
inline void voi_query(R int l, R int r)
{
for (R int i = l; i <= r; ++i)
if (a[i] >= w) ++ans;
}
inline void voi_add(R int l, R int r)
{
for (R int i = l; i <= r; ++i)
a[i] += w;
build(id[l]);
}
inline void query(R int x)
{
R int l = x * block, r = (x + 1) * block - 1;
cmin(r, n);
ans += (r - l + 1) - (std::lower_bound(b + l, b + r + 1, w - tag[x]) - b - l);
}
int main()
{
// setfile();
n = FastIn(), q = FastIn();
block = sqrt(n);
// printf("sizes = %d\n", block );
for (R int i = 1; i <= n; ++i) a[i] = FastIn();
for (R int i = 1; i <= n; ++i) id[i] = i / block;
for (R int i = 0; i <= n / block; ++i) build(i);
for (R int i = 1; i <= q; ++i)
{
R char opt = getc();
while (opt < 'A' || opt > 'Z') opt = getc();
R int l = FastIn(), r = FastIn(); w = FastIn();
if (opt == 'A')
{
ans = 0;
if (id[l] == id[r]) voi_query(l, r);
else
{
voi_query(l, (id[l] + 1) * block - 1);
voi_query(id[r] * block, r);
for (R int i = id[l] + 1; i < id[r]; ++i)
query(i);
}
printf("%d\n", ans );
}
else
{
if (id[l] == id[r]) voi_add(l, r);
else
{
voi_add(l, (id[l] + 1) * block - 1);
voi_add(id[r] * block, r);
for (R int i = id[l] + 1; i < id[r]; ++i)
tag[i] += w;
}
}
}
return 0;
}

最新文章

  1. VS2010添加类失败问题,弹出错误框,提示 CodeModel操作失败,无法访问标记数据库
  2. C# 不支持关键字: “.;database”。
  3. jQuery EasyUI API 中文文档
  4. 转载ASP.NET MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
  5. Swift轻松入门——基本语法介绍和详细地Demo讲解(利用WebView打开百度、新浪等网页)
  6. js中setTimeout/setInterval定时器用法示例
  7. 查询最小未使用ID的SQL查询
  8. perl encode_utf8 和decode_utf8
  9. TCP连接状态具体解释
  10. IDE编程环境
  11. linux CTRL+Z
  12. while补充,字符串和数字的内置方法
  13. Apache下载、安装及配置(Windows版)
  14. 问题解决--无法解析的外部符号 _imp_XXXXXXXXX
  15. NodeJS缓冲区
  16. python摸爬滚打之day16----类的成员
  17. A Plug for UNIX POJ - 1087(模板题 没啥好说的。。就用了一个map)
  18. Eclipse使用Git管理项目
  19. 遍历 JSON JavaScript 对象树中的所有节点
  20. Control reaches end of non-void function 犯过最傻的错误

热门文章

  1. vue仿阿里云后台管理(附加阿里巴巴图标使用)
  2. 利用coverage工具进行Python代码覆盖率测试
  3. java文件编译后,出现xx$1.class的原因
  4. Java第五周作业+总结
  5. python深度学习培训概念整理
  6. sql query执行的顺序
  7. C#打印条码BarTender SDK打印之路和离开之路(web平凡之路)(转)
  8. windows上利用dhcpsrv搭建DHCP服务器
  9. 1. Docker快速入门(仓库,镜像,容器)
  10. sublime text 3基本参数设置及插件使用