题目大意:有$n$个数,$q$个操作。两种操作:

  1. $M\;l\;r\;w:$把$[l,r]$所有数加上$w$
  2. $A\;l\;r\;c:$查询$[l,r]$内大于等于$c$的元素的个数。

题解:分块,对于在整块修改改$tag$,非整块暴力修改,查询整块用$lower\_bound$,非整块暴力

卡点:

C++ Code:

#include <cstdio>
#include <cmath>
#include <algorithm>
#define maxn 1000010
int n, Q, bsz, num;
int l[1010], r[1010], tg[1010];
struct node {
int w, id;
inline bool operator < (const node &rhs) const {return w < rhs.w;}
} s[maxn];
int main() {
scanf("%d%d", &n, &Q); bsz = sqrt(n);
for (int i = 1; i <= n; i++) scanf("%d", &s[i].w), s[i].id = i;
num = n / bsz + 1;
for (int i = 1; i <= num; i++) {
l[i] = (i - 1) * bsz;
if (i == 1) l[i] = 1;
r[i] = i * bsz - 1;
if (i == num) r[i] = n;
std::sort(s + l[i], s + r[i] + 1);
}
while (Q --> 0) {
char op[10];
int x, y, z;
scanf("%s%d%d%d", op, &x, &y, &z);
int lb = x / bsz + 1, rb = y / bsz + 1;
if (op[0] == 'M') {
if (lb == rb) {
for (int i = l[lb]; i <= r[lb]; i++) {
s[i].w = tg[lb];
if (s[i].id >= x && s[i].id <= y) s[i].w += z;
}
tg[lb] = 0;
std::sort(s + l[lb], s + r[lb]);
} else {
for (int i = l[lb]; i <= r[lb]; i++) {
s[i].w += tg[lb];
if (s[i].id >= x) s[i].w += z;
}
std::sort(s + l[lb], s + r[lb] + 1);
for (int i = lb + 1; i < rb; i++) tg[i] += z;
for (int i = l[rb]; i <= r[rb]; i++) {
s[i].w += tg[lb];
if (s[i].id <= y) s[i].w += z;
}
std::sort(s + l[rb], s + r[rb] + 1);
tg[lb] = tg[rb] = 0;
}
} else {
int ans = 0;
if (lb == rb) {
for (int i = l[lb]; i <= r[lb]; i++) {
s[i].w += tg[lb];
if (s[i].id >= x && s[i].id <= y && s[i].w >= z) ans++;
}
tg[lb] = 0;
} else {
for (int i = l[lb]; i <= r[lb]; i++) {
s[i].w += tg[lb];
if (s[i].id >= x && s[i].w >= z) ans++;
}
for (int i = lb + 1; i < rb; i++) {
ans += s + r[i] - std::lower_bound(s + l[i], s + r[i] + 1, (node) {z - tg[i], 0}) + 1;
}
for (int i = l[rb]; i <= r[rb]; i++) {
s[i].w += tg[rb];
if (s[i].id <= y && s[i].w >= z) ans++;
}
tg[lb] = tg[rb] = 0;
}
printf("%d\n", ans);
}
}
return 0;
}

[洛谷P2801]教主的魔法的更多相关文章

  1. 洛谷 P2801 教主的魔法 解题报告

    P2801 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.--.N. ...

  2. 洛谷——P2801 教主的魔法(线段树or分块)

    P2801 教主的魔法 (1) 若第一个字母为“M”,则紧接着有三个数字L.R.W.表示对闭区间 [L, R] 内所有英雄的身高加上W. (2) 若第一个字母为“A”,则紧接着有三个数字L.R.C.询 ...

  3. 洛谷P2801 教主的魔法 [分块,二分答案]

    题目传送门 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. ...

  4. 洛谷 P2801 教主的魔法

    题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是 ...

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

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

  6. 洛谷P2801 教主的魔法 分块

    正解:分块 解题报告: 哇之前的坑还没填完就又写新博客? 不管不管,之前欠的两三篇题解大概圣诞节之前会再仔细想想然后重新写下题解趴,确实还挺难的感觉没有很好的理解呢QAQ还是太囫囵吞枣不求甚解了,这样 ...

  7. 洛谷 P2801 教主的魔法 题解

    题面 刚看到这道题的时候用了个树状数组优化前缀和差分的常数优化竟然AC了?(这数据也太水了吧~) 本人做的第一道分块题,调试了好久好久,最后竟然没想到二分上还会出错!(一定要注意)仅此纪念: #inc ...

  8. P2801 教主的魔法(分块)

    P2801 教主的魔法 区间加法,区间查询 显然就是分块辣 维护一个按块排好序的数组. 每次修改依然是整块打标记,零散块暴力.蓝后对零散块重新排序. 询问时整块二分,零散块暴力就好辣 注意细节挺多和边 ...

  9. P2801 教主的魔法 (线段树)

    题目 P2801 教主的魔法 解析 成天做水题 线段树,第一问区间加很简单 第二问可以维护一个区间最大值和一个区间最小值,若C小于等于区间最小值,就加上区间长度,若C大于区间最大值,就加0 ps:求教 ...

随机推荐

  1. java XML 通过BeanUtils的population为对象赋值 根据用户选择进行dom4j解析

    根据xml文件设计Student对象 <?xml version="1.0" encoding="UTF-8"?> <students> ...

  2. CocoaAsyncSocket使用

    代理的.h文件 #import <Foundation/Foundation.h> #import "GCDAsyncSocket.h" typedef void(^S ...

  3. 用IDEA搭建基于maven的springboot项目

     第一步:新建一个Project 第二步:选择Spring Initializr和SDK 然后next  第三步:修改Group和Artifact 第四步:按自己的需求选,这里我选的是Web,然后ne ...

  4. 【学时总结】 ◆学时·II◆ IDA*算法

    [学时·II] IDA*算法 ■基本策略■ 如果状态数量太多了,优先队列也难以承受:不妨再回头看DFS-- A*算法是BFS的升级,那么IDA*算法是对A*算法的再优化,同时也是对迭代加深搜索(IDF ...

  5. Hibernate无法提取结果集

    原因:表结构错误或 与 映射文件不一致 org.springframework.dao.InvalidDataAccessResourceUsageException: could not extra ...

  6. 特殊sql查询方法实例

    一.if条件查询:SELECT sum(if(is_buy > 0 ,1,0)) AS friend_count_all_cj, sum(if(is_buy = 0 ,1,0)) AS frie ...

  7. 呕心沥血写的python猜数字

    #猜数字 import random num_rd=random.randint(0,100) count=1 while 1<=count<=10: num_ip=input('请输入0 ...

  8. C语言字符篇(五)内存函数

    memcpy不可以把目的地址写成本身 但是memmove可以,因为它是先保存到临时空间 #include <string.h>   void *memcpy(void *dest, con ...

  9. Mplab X IDE 安装DMCI

     DMCI在Mplab 8中是默认安装的,在 Mplab X IDE中是作为插件,默认不安装.   找到     勾选前面的复选框,点击安装

  10. [Azure Storage]使用Java上传文件到Storage并生成SAS签名

    Azure官网提供了比较详细的文档,您可以参考:https://azure.microsoft.com/en-us/documentation/articles/storage-java-how-to ...