BZOJ_3343_教主的魔法_分块+二分查找
BZOJ_3343_教主的魔法_分块+二分查找
题意:教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是N个英雄们又一次聚集在了一起,这次他们排成了一列被编号为1、2、……、N。每个人的身高一开始都是不超过1000的正整数。教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W。(虽然L=R时并不符合区间的书写规范,但我们可以认为是单独增加第L(R)个英雄的身高)询问WD闭区间 [L, R] 内有多少英雄身高大于等于C,以验证教主的魔法是否真的有效。
分析:分块。
每一块用一个辅助数组来排序,询问时整块二分查找大于等于C的位置,零散的暴力重构。
重构时可以归并也可以直接sort
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define N 1000010
#define LL long long
void read(LL &x){
int f=1;x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=(x<<3)+(x<<1)+s-'0';s=getchar();}
x*=f;
}
int L[1010],R[1010],pos[N],t,is[1010],add[1010],n,q;
LL a[N],b[N];
int find(int blo,LL x){
int l=L[blo],r=R[blo]+1;
while(l<r){
int mid=l+r>>1;
if(b[mid]<x)l=mid+1;
else r=mid;
}return R[blo]-l+1;
}
inline void pre(int blo){
for(int i=L[blo];i<=R[blo];i++)b[i]=a[i];
sort(b+L[blo],b+R[blo]+1);
}
void up(int l,int r,LL c){
int p=pos[l],q=pos[r];
if(p==q){
for(int i=l;i<=r;i++){
a[i]+=c;
}
pre(p);
}else{
for(int i=p+1;i<q;i++){
add[i]+=c;
}
for(int i=l;i<=R[p];i++){
a[i]+=c;
}
for(int i=L[q];i<=r;i++){
a[i]+=c;
}
pre(p);pre(q);
}
}
int query(int l,int r,LL c){
int p=pos[l],q=pos[r];
int ans=0;
if(p==q){
for(int i=l;i<=r;i++)if(a[i]+add[p]>=c)ans++;
}else{
for(int i=p+1;i<q;i++){
ans+=find(i,c-add[i]);
}
for(int i=l;i<=R[p];i++){
if(a[i]+add[p]>=c)ans++;
}
for(int i=L[q];i<=r;i++){
if(a[i]+add[q]>=c)ans++;
}
}
return ans;
}
char op[10];
int main(){
scanf("%d%d",&n,&q);
t=sqrt(n);
for(int i=1;i<=t;i++){
L[i]=R[i-1]+1,R[i]=t*i;
for(int j=L[i];j<=R[i];j++){
read(a[j]);pos[j]=i;
}
}
if(n-t*t){
t++;L[t]=R[t-1]+1;R[t]=n;
for(int i=L[t];i<=R[t];i++){
read(a[i]);pos[i]=t;
}
}
for(int i=1;i<=t;i++)pre(i);
int x,y,z;
while(q--){
scanf("%s%d%d%d",op,&x,&y,&z);
if(op[0]=='M'){
up(x,y,1ll*z);
}else{
printf("%d\n",query(x,y,1ll*z));
}
}
}
BZOJ_3343_教主的魔法_分块+二分查找的更多相关文章
- BZOJ 3343: 教主的魔法(分块+二分查找)
		
BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: ...
 - 【bzoj2957】楼房重建  分块+二分查找
		
题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子.为了简化问题,我们考虑这些事件发生在一个二 ...
 - P2801 教主的魔法(分块)
		
P2801 教主的魔法 区间加法,区间查询 显然就是分块辣 维护一个按块排好序的数组. 每次修改依然是整块打标记,零散块暴力.蓝后对零散块重新排序. 询问时整块二分,零散块暴力就好辣 注意细节挺多和边 ...
 - BZOJ 3343:教主的魔法(分块)
		
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3343 [题目大意] 给出一个数列,有区间加法操作,询问区间大于等于c的数字个数 [题解 ...
 - bzoj3343 教主的魔法【分块入门】By cellur925
		
题意:维护一个数列,给出维护区间加法,询问区间内大于等于某个值的元素个数. 算法:分块.因为本题第二问显然可以用二分的思想,但是这貌似并不符合区间可加性,线段树好像就不好用了呢.所以本蒟蒻学习了分块. ...
 - 「BZOJ3343」教主的魔法(分块+二分查找)
		
题意: 给定一个数列,您需要支持以下两种操作:给[l,r]同加一个数询问[l,r]中有多少数字大于或等于v (n<=1000000,m<=3000) 题解 块内排序二分查询修改就用个数组存 ...
 - 【tyvj1463】智商问题 [分块][二分查找]
		
Background 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! Description 某个同学又有很多小姊妹了他喜欢聪明的小姊妹 所以经常用神奇的函数来估算小姊妹的智商他得出了自己所有 ...
 - 【Luogu】P2801教主的魔法(分块)
		
题目链接 激动qwq.这是我A的第一道分块. 分块之后对块内元素暴力sort.修改的时候对于整块打个标记,查询的时候只需要查C-tag就行了 对于非整块,暴力修改,改完之后sort 对于查询……非整块 ...
 - BZOJ 3343 教主的魔法(分块)
		
题意: 有一个1e6的数组,t次操作:将[l,r]内的值增加w,或者查询[l,r]内的值大于等于add的 思路: 分块,块大小为sqrt(n),每次只需要暴力头尾两块,中间的整块打标记, 对于查询查操 ...
 
随机推荐
- log4j日志的配置
			
在项目开发中,记录错误日志方便调试.便于发现系统运行过程中的错误.便于后期分析, 在java中,记录日志有很多种方式,比如说log4j log4j需要导入的包: commons-loggin.jar ...
 - 企业级web负载均衡完美架构
			
转载:揭秘企业级web负载均衡完美架构(图) 2010-07-06 15:16 抚琴煮酒 51CTO.com 字号:T | T 相信很多朋友对企业级的负载均衡高可用实例非常感兴趣,此篇文章根据成熟的线 ...
 - Linux服务器安全审计工具与流程完全指南
			
http://Linux.chinaitlab.com/server/860516.html 当今许多linux服务器都不是刚刚部署完毕的新机器,有专业的Linux系统管理员进行定期维护,IT技术人员 ...
 - 印钞机 V1.0(量化选基总结)
			
今年的元旦,在家把之前手工的选基方法完全程序化了.这是我的"印钞机" V1.0. 为什么叫印钞机,详细情况可见下文及最后的总结. 量化选基成果 我的主要基金投资方法其实就是量化选基 ...
 - JDK安装:CentOS和Windows环境
			
Windows上JDK安装 1:下载jdk. 地址在 http://www.oracle.com/index.html >downloads>se>Ja ...
 - Java多线程:wait(),notify(),notifyAll()
			
1. wait(),notify(),notifyAll() 2. wait() 2.1. wait() 2.2. wait(long timeout) 2.3. wait(long timeout, ...
 - nfs 、ftp 和samba都有什么区别?
			
NFS:Network File System 是已故的Sun公司制定的用于分布式访问的文件系统,它的本质是文件系统.主要在Unix系列操作系统上使用,基于TCP/IP协议层,可以将远程的计算机磁盘挂 ...
 - python爬虫人门(10)Scrapy框架之Downloader Middlewares
			
设置下载中间件(Downloader Middlewares) 下载中间件是处于引擎(crawler.engine)和下载器(crawler.engine.download())之间的一层组件,可以有 ...
 - 高性能网络通信框架 HP-Socket
			
HP-Socket 详细介绍 HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/ ...
 - Python并发编程之线程中的信息隔离(五)
			
大家好,并发编程 进入第三篇. 上班第一天,大家应该比较忙吧.小明也是呢,所以今天的内容也很少.只要几分钟就能学完. 昨天我们说,线程与线程之间要通过消息通信来控制程序的执行. 讲完了消息通信,今天就 ...