P2801 教主的魔法 (线段树)
题目
解析
成天做水题
线段树,第一问区间加很简单
第二问可以维护一个区间最大值和一个区间最小值,若C小于等于区间最小值,就加上区间长度,若C大于区间最大值,就加0
ps:求教指针线段树,我的空间怎么那么大
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10;
int n, m, num;
int a[N];
class tree {
public :
int mx, mn, sum;
int lazy, len;
tree *ls, *rs;
tree() {
sum = mx = mn = lazy = len = 0;
ls = rs = NULL;
}
} t[N];
template<class T>inline void read(T &x) {
x = 0; int f = 0; char ch = getchar();
while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
x = f ? -x : x;
return;
}
inline void pushup(tree *rt) {
rt->mn = min(rt->ls->mn, rt->rs->mn);
rt->mx = max(rt->ls->mx, rt->rs->mx);
}
void build(int l, int r, tree *rt) {
rt->len = r - l + 1;
if (l == r) {
rt->mn = rt->mx = a[l];
return;
}
rt->ls = &t[++num], rt->rs = &t[++num];
int m = (l + r) >> 1;
build(l, m, rt->ls), build(m + 1, r, rt->rs);
pushup(rt);
}
inline void pushdown(tree *rt) {
if (rt->lazy) {
rt->ls->mx += rt->lazy;
rt->rs->mx += rt->lazy;
rt->ls->mn += rt->lazy;
rt->rs->mn += rt->lazy;
rt->ls->lazy += rt->lazy;
rt->rs->lazy += rt->lazy;
rt->lazy = 0;
}
}
void update(int L, int R, int c, int l, int r, tree *rt) {
if (L <= l && r <= R) {
rt->mn += c;
rt->mx += c;
rt->lazy += c;
return;
}
pushdown(rt);
int m = (l + r) >> 1;
if (L <= m) update(L, R, c, l, m, rt->ls);
if (R > m) update(L, R, c, m + 1, r, rt->rs);
pushup(rt);
}
int query(int L, int R, int c, int l, int r, tree *rt) {
if (L <= l && r <= R && rt->mn >= c) return rt->len;
if (L <= l && r <= R && rt->mx < c) return 0;
pushdown(rt);
int m = (l + r) >> 1, ans = 0;
if (L <= m) ans += query(L, R, c, l, m, rt->ls);
if (R > m) ans += query(L, R, c, m + 1, r, rt->rs);
return ans;
}
int main() {
read(n), read(m);
for (int i = 1; i <= n; ++i) read(a[i]);
tree *rt = new tree;
build(1, n, rt);
for (int i = 1, x, y, z; i <= m; ++i) {
char c;
cin >> c;
read(x), read(y), read(z);
if (c == 'M')
update(x, y, z, 1, n, rt);
else
printf("%d\n", query(x, y, z, 1, n, rt));
}
delete rt;
return 0;
}
P2801 教主的魔法 (线段树)的更多相关文章
- 洛谷——P2801 教主的魔法(线段树or分块)
P2801 教主的魔法 (1) 若第一个字母为“M”,则紧接着有三个数字L.R.W.表示对闭区间 [L, R] 内所有英雄的身高加上W. (2) 若第一个字母为“A”,则紧接着有三个数字L.R.C.询 ...
- P2801 教主的魔法(分块)
P2801 教主的魔法 区间加法,区间查询 显然就是分块辣 维护一个按块排好序的数组. 每次修改依然是整块打标记,零散块暴力.蓝后对零散块重新排序. 询问时整块二分,零散块暴力就好辣 注意细节挺多和边 ...
- 洛谷 P2801 教主的魔法 解题报告
P2801 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.--.N. ...
- 洛谷P2801 教主的魔法 [分块,二分答案]
题目传送门 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. ...
- 魔法 [线段树优化DP]
也许更好的阅读体验 \(\mathcal{Description}\) 小 \(D\) 正在研究魔法. 小 \(D\) 得到了远古时期的魔法咒语 \(S\),这个咒语共有 \(n\) 个音节,每个音节 ...
- luogu P2801 教主的魔法
题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是 ...
- 洛谷 P2801 教主的魔法
题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是 ...
- BZOJ——3343: 教主的魔法 || 洛谷—— P2801 教主的魔法
http://www.lydsy.com/JudgeOnline/problem.php?id=3343 || https://www.luogu.org/problem/show?pid=280 ...
- P2801 教主的魔法
传送门 $N$ 太大了主席树过不了 考虑分块 对每个块内的元素排序,询问就对大块二分查找,对两边小的部分暴力枚举 修改时维护 $add[i]$ 标记,维护当前块内整块已经加的数 那么整块的就直接修改 ...
随机推荐
- 如何保证MQ的顺序性?比如Kafka
三.如何保证消息的顺序性 1. rabbitmq 拆分多个queue,每个queue一个consumer,就是多一些queue而已,确实是麻烦点:或者就一个queue但是对应一个consumer,然后 ...
- 【Beta】Phylab 测试报告
PhyLab Beta 测试报告 测试中发现的bug Beta阶段新Bug Bug 可能原因 markdown生成的报告可能溢出显示框 表格过长,显示框未设置横向溢出 移动端实验区无法评论 移动端社区 ...
- Beef搭建并通过Nginx绑定域名
Beef和Nginx安装过程这里就不再说明了相关链接:Beef官方安装教程 1. 修改Beef的config.yaml配置文件 xss连接地址改成要绑定的域名 sudo vim /beef/confi ...
- 让ie10/11支持非单页面的vue/es6
为了满足某些客户的要求,最近让前端同学实现了ie 10(windows 7)/11(windows 10)支持多页面的vue/es6,基本参考如下: https://www.cnblogs.com/n ...
- easyui datagrid生成序号列formatter
var opts1; $('#datagrid_1').datagrid({ columns: [ [{ field: 'myNo', title: '序号', align: 'center', wi ...
- Web打印的解决方案之证件套打
由于以前未接触过套打,一直觉得套打是一个比较神秘和麻烦的事情,因为打印机的位置总是需要调整的,你总不能硬编码吧?但是如果位置可调,有需要直观一些来处理,那就比较麻烦了. 在前面介绍过<Web打印 ...
- springmvc@RequestMapping-params参数规则
springmvc@RequestMapping-params参数规则 https://blog.csdn.net/qq_33439525/article/details/78193190 版权声明: ...
- 每日题解: 两数之和 & 有效的括号
- 码云push时提示 DeployKey does not support push code fatal: Could not read from remote repository.
一.如果需要push代码到码云,需要创建个人公钥,公共公钥只可以读不可以修改 二.执行代码即可:git push
- mysqldump导出完整sql脚本
#导出某个数据库--结构+数据 shell>mysqldump -h192.168.161.124 -uroot -pxxxxxx --opt db_name |gzip -9 > /db ...