当前位置: 首页 > news >正文

[洛谷P2801]教主的魔法

题目大意:有$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;
} 

 

转载于:https://www.cnblogs.com/Memory-of-winter/p/9534357.html

相关文章:

  • 共享服务-FTP基础(一)
  • ZYNQ的Linux Linaro系统镜像制作SD卡启动
  • intellij idea 编译 kafka 源码
  • 杂项-Java:Druod Monitor
  • mysql+centos7+主从复制
  • BZOJ1052 [HAOI2007]覆盖问题
  • RabbitMQ消息中介之Python使用
  • Android下的一些命令
  • Xshell连接虚拟机文档教程
  • 2-10 案例4:像素读取写入
  • Python基础之数据类型和变量
  • SpringCloud组件相关
  • 2.进程与程序的关系
  • 【一步一步学习spring】【番外】IOC 设计原理与实现
  • Python 面向对象 2
  • #Java异常处理
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【个人向】《HTTP图解》阅后小结
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 【知识碎片】第三方登录弹窗效果
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Consul Config 使用Git做版本控制的实现
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Flannel解读
  • HTTP中的ETag在移动客户端的应用
  • iOS 系统授权开发
  • JavaScript设计模式之工厂模式
  • JS专题之继承
  • LintCode 31. partitionArray 数组划分
  • Linux快速复制或删除大量小文件
  • react 代码优化(一) ——事件处理
  • Web设计流程优化:网页效果图设计新思路
  • 不上全站https的网站你们就等着被恶心死吧
  • 反思总结然后整装待发
  • 服务器之间,相同帐号,实现免密钥登录
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 入手阿里云新服务器的部署NODE
  • 使用docker-compose进行多节点部署
  • 使用parted解决大于2T的磁盘分区
  • 算法---两个栈实现一个队列
  • 一、python与pycharm的安装
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​MySQL主从复制一致性检测
  • (1)虚拟机的安装与使用,linux系统安装
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (ZT)薛涌:谈贫说富
  • (八)Spring源码解析:Spring MVC
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (算法二)滑动窗口
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置