【bzoj3343】教主的魔法 (分块 + 二分)

传送门(权限题)

题目分析

题意为:给定一个数列,修改和查询两种操作,修改每次给定一个区间,区间的所有元素都加上一个给定值,查询询问一段区间的数权值大于等于给定值的数有多少个。 首先对原序列分块,然后将分块后的数组每个块内的数字进行排序,这样查询时就可以暴力枚举散块,并二分枚举每个整块。对于修改,对于整块部分只需修改tag,然后暴力修改散块的原序列值,然后对散块元素所在块进行重排序即可。

code

3048 ms

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;const int N = 1e6 + 5;
int n, Q, h[N], H[N], tag[N], S, blo;
#define bug(x) cout<<#x<<":"<<x<<endl
inline int read(){int i = 0, f = 1; char ch = getchar();for(; (ch < '0' || ch > '9') && ch != '-'; ch = getchar());if(ch == '-') f = -1, ch = getchar();for(; ch >= '0' && ch <= '9'; ch = getchar())i = (i << 3) + (i << 1) + (ch - '0');return i * f;
}inline void wr(int x){if(x < 0) putchar('-'),x = -x;if(x > 9) wr(x / 10);putchar(x % 10 + '0');
}inline void add(int x, int y, int v){if(y - x + 1 <= 2 * S){for(int i = x; i <= y; i++)h[i] += v;}int Bx = x / S + (x % S ? 1 : 0), By = y / S + (y % S ? 1 : 0);int L = Bx + 1, R = By - 1;if(x == (Bx - 1) * S + 1) L--;if(y == min(n, By * S)) R++;int ans = 0;for(int i = x; i < (L - 1) * S; i++)h[i] += v;int l = (Bx - 1) * S + 1, r = min(n, Bx * S);for(int i = l; i <= r; i++)H[i] = h[i];sort(H + l, H + r + 1);for(int i = min(n, R * S) + 1; i <= y; i++)h[i] += v;l = (By - 1) * S + 1, r = min(n, By * S);for(int i = l; i <= r; i++)H[i] = h[i];sort(H + l, H + r + 1);for(int i = L; i <= R; i++)tag[i] += v;
}inline int query(int x, int y, int v){int ans = 0;if(y - x + 1 <= 2 * S){for(int i = x; i <= y; i++)if(h[i] + tag[i / S + (i % S ? 1 : 0)] >= v) ans++;return ans;}int Bx = x / S + (x % S ? 1 : 0), By = y / S + (y % S ? 1 : 0);
//    bug(Bx), bug(By);int L = Bx + 1, R = By - 1;if(x == (Bx - 1) * S + 1) L--;if(y == min(n, By * S)) R++;    
//    bug(L), bug(R);for(int i = x; i <= (L - 1) * S; i++)if(h[i] + tag[Bx] >= v) ans++;for(int i = min(n, R * S) + 1; i <= y; i++)if(h[i] + tag[By] >= v) ans++;for(int i = L; i <= R; i++){int l = (i - 1) * S + 1, r = min(n, i * S), len = r - l + 1;int tmp = lower_bound(H + l, H + r + 1, v - tag[i]) - (H + l - 1);ans += len - (tmp - 1);}return ans;
}int main(){n = read(), Q = read(), S = sqrt(n), blo = n / S + (n % S ? 1 : 0);
//    bug(S);for(int i = 1; i <= n; i++) h[i] = H[i] = read();for(int i = 1; i <= blo; i++){int l = (i - 1) * S + 1, r = min(i * S, n);sort(H + l, H + r + 1);}for(int i = 1; i <= Q; i++){char opt[5]; scanf("%s", opt + 1);if(opt[1] == 'M'){int l = read(), r = read(), w = read();add(l, r, w);}else if(opt[1] == 'A'){int l = read(), r = read(), c = read();wr(query(l, r, c)), putchar('\n');}}return 0;
}

 

转载于:https://www.cnblogs.com/CzYoL/p/7396352.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang——string字符串常用函数(Contains、join、Index、Repeat、Replace、Split、Trim、Fields)

更多的还是去官方文档里去看&#xff1a;https://studygolang.com/pkgdoc Contains&#xff1a; 判断字符串中是否包含指定字符串 演示&#xff1a; func main() {str1 : "itzhuzhu"result : strings.Contains(str1, "zhu")fmt.Println(result) }join&a…

[flask 优化] 由flask-bootstrap,flask-moment引起的访问速度慢的原因及解决办法

一周时间快速阅读了400页的《javascript基础教程》&#xff0c;理解了主要概念。解决了一个很久之前的疑问。 我的网站是使用flask框架搭建的&#xff0c;介绍flask web的一本著名的书&#xff08;之前提到过&#xff09;作者搭建个人博客时&#xff0c;向读者推荐了flask-boot…

Go_关键字、编译、转义字符

关键字&#xff1a; 关键字是指被go语言赋予了特殊含义的单词&#xff0c;共25个&#xff0c;关键字不能用于自定义名字&#xff0c;只能在特定语法结构中使用。 breakdefaultfuncinterfaceselectcasedefergomapstructchanelsegotopackageswitchconstfallthroughifrangetypec…

NFS服务配置

NFS会经常用到&#xff0c;用于在网络上共享存储。举一个例子来说明一下NFS是用来做什么的。假如有三台机器A, B, C&#xff0c;它们需要访问同一个目录&#xff0c;目录中都是图片&#xff0c;传统的做法是把这些图片分别放到A, B, C. 但是使用NFS只需要放到A上&#xff0c;然…

Go_数据类型转换(Sprintf、Format、Append方式转换)

数据类型转换&#xff1a; 类型转换是将一种数据类型的变量转为另一种类型的变量Go强制要求使用显式类型转换。所以语法更能确定语句及表达式的明确含义转换的时候如果大的转给小的&#xff0c;会有精度损失&#xff08;数据溢出&#xff09;比如int64转int8 转换格式&#xff…

Mybayis的项目使用的Mapping文件使用总结参考(一)

作者:longgangbai 以前用过ibatis2,但是听说ibatis3有较大的性能提升&#xff0c;而且设计也更合理&#xff0c;他不兼容ibatis2.尽管ibatis3还是beta10的状态&#xff0c;但还是打算直接使用ibatis3.0, ibatis3.0应该更简单高效.最近还自己写了个ibatis3.0与spring集成的bean&…

并发编程概念、程序线程进程、线程同步、互斥量、读写锁、协程并发

多线程&#xff1a; 多线程就是同时执行多个应用程序&#xff0c;需要硬件的支持同时执行&#xff1a;不是某个时间段同时&#xff0c;cpu切换的比较快&#xff0c;所有用户会感觉是在同时运行 并发与并行&#xff1a; 并行(parallel)&#xff1a;指在同一时刻&#xff0c;有多…

第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)

本章学习如何启动第一个应用程序 1.在前面的分析中我们了解到&#xff0c;在init进程中内核挂接到根文件系统之后&#xff0c;会开始启动第一个应用程序: kernel_init函数代码如下: static int __init kernel_init(void * unused) //进入init进程 …

Golang并发——并发技术Goroutine和channel的使用、定时器、生产者消费者、条件变量、select

Goroutine: goroutine是Go并行设计的核心。goroutine说到底其实就是协程&#xff0c;它比线程更小&#xff0c;十几个goroutine可能体现在底层就是五六个线程&#xff0c;Go语言内部帮你实现了这些goroutine之间的内存共享。执行goroutine只需极少的栈内存(大概是4~5KB)&#x…

Golang——死锁、互斥锁、读写锁的实现

死锁&#xff1a; 什么是锁呢&#xff1f;就是某个协程&#xff08;线程&#xff09;在访问某个资源时先锁住&#xff0c;防止其它协程的访问&#xff0c;等访问完毕解锁后其他协程再来加锁进行访问。这和我们生活中加锁使用公共资源相似&#xff0c;例如&#xff1a;公共卫生间…

Oozie协作框架

Oozie协作框架 一&#xff1a;概述 1.大数据协作框架 2.Hadoop的任务调度 3.Oozie的三大功能 Oozie Workflow jobs Oozie Coordinator jobs Oozie Bundle 4.Oozie的架构 控制流节点 起始&#xff0c;分支&#xff0c;并发&#xff0c;汇合&#xff0c;结束 动作节点action 5.O…

11.4 专利法与反不正当竞争法解读

第六条是对于职务作品的一个定性.它这个职务作品、职务发明创造和我们前面著作法所讲到的职务作品的处理方式基本一致.就是如果认定某一个作品它是属于职务作品、职务发明创造,那么这一个作品它的专利权应该是属于单位而不是个人.只有认定这个创造为非职务发明创造的时候,申请的…

一文入门网络编程:常见协议、通信过程、Socket、CS/BS、TCP/UDP

网络编程三要素&#xff1a;ip地址、端口、协议&#xff0c;在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;可以进行数据传输 常见协议&#xff1a; 传输层 常见协议有TCP/UDP协议。应用层 常见的协议有HTTP协议&#xff0c;FTP协议。网络层 常见协议有IP协议…

【Linux笔记(000) 】-- 系统启动过程

索引&#xff1a; 目录索引 一. 启动流程 BIOS --> MBR(Boot Code) --> 引导程序(GRUB) --> 加载内核 --> 执行Init --> runlevel 二. 内容详解 BIOS: Basic Input Output System , 基本输入输出系统 ,负责检查硬件,查找启动设备, 可启动设备在BIOS中定义。…

Mac安装Netcat教程

Netcat可以用于测试通信连接 Mac安装Netcat方式&#xff1a; 打开终端输入&#xff1a; brew install netcat安装好以后测试&#xff0c;输入&#xff1a; nc可以看到是这样的&#xff1a; itzhuzhuitzhuzhudeMacBook-Pro ~ % brew install netcat > Downloading https:…

Golang——TCP、UDP实现并发(服务端与客户端)

Server端常用函数、接口&#xff1a; Listen函数&#xff1a;func Listen(network, address string) (Listener, error)network&#xff1a;选用的协议&#xff1a;TCP、UDP&#xff0c; 如&#xff1a;“tcp”或 “udp”address&#xff1a;IP地址端口号, 如&#xff1a;…

java中 将字符串时间 '2015-9-8 17:05:06' 转化为格式 '2015-09-08 17:05:06'

/** * 将字符串时间2015-9-8 17:05:06转化为格式2015-09-08 17:05:06 */import java.text.SimpleDateFormat; public class TestDate{ public static void main(String[] args) throws Exception{ String time "2015-9-8 17:05:06";//注意&#xff1a;时分秒必须都…

详解TCP协议三次握手四次挥手

三次握手&#xff1a; 三次握手表示建立通信阶段&#xff0c;在TCP协议中&#xff0c;在发送数据的准备阶段&#xff0c;客户端与服务器之间的三次交互&#xff0c;以保证连接的可靠&#xff0c;由于这种面向连接的特性&#xff0c; TCP协议可以保证传输数据的安全&#xff0c;…

Visual Paradigm中文乱码

http://blog.csdn.net/microrain/article/details/1201661?_t_t_t0.8160515017611372 转载于:https://www.cnblogs.com/mkxzy/p/7420463.html

Golang——实现文件传输

借助TCP完成文件的传输&#xff0c;基本思路如下&#xff1a; 发送方&#xff08;客户端&#xff09;向服务端发送文件名&#xff0c;服务端保存该文件名。接收方&#xff08;服务端&#xff09;向客户端返回一个消息ok&#xff0c;确认文件名保存成功。发送方&#xff08;客户…