Bzoj 3343: 教主的魔法 分块,二分

时间:2022-09-10 07:38:31

3343: 教主的魔法

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 821  Solved: 364
[Submit][Status][Discuss]

Description

教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1、2、……、N
每个人的身高一开始都是不超过1000的正整数。教主的魔法每次可以把闭区间[LR](1≤LRN)内的英雄的身高全部加上一个整数W。(虽然L=R时并不符合区间的书写规范,但我们可以认为是单独增加第LR)个英雄的身高)
CYZ、光哥和ZJQ等人不信教主的邪,于是他们有时候会问WD闭区间 [LR] 内有多少英雄身高大于等于C,以验证教主的魔法是否真的有效。
WD巨懒,于是他把这个回答的任务交给了你。
 

Input

       第1行为两个整数NQQ为问题数与教主的施法数总和。
       第2行有N个正整数,第i个数代表第i个英雄的身高。
       第3到第Q+2行每行有一个操作:
(1)       若第一个字母为“M”,则紧接着有三个数字LRW。表示对闭区间 [LR] 内所有英雄的身高加上W
(2)       若第一个字母为“A”,则紧接着有三个数字LRC。询问闭区间 [LR] 内有多少英雄的身高大于等于C
 

Output

       对每个“A”询问输出一行,仅含一个整数,表示闭区间 [LR] 内身高大于等于C的英雄数。
 

Sample Input

5 3
1 2 3 4 5
A 1 5 4
M 3 5 1
A 1 5 4

Sample Output

2
3

HINT

【输入输出样例说明】
原先5个英雄身高为1、2、3、4、5,此时[1, 5]间有2个英雄的身高大于等于4。教主施法后变为1、2、4、5、6,此时[1, 5]间有3个英雄的身高大于等于4。
 
【数据范围】
对30%的数据,N≤1000,Q≤1000。
对100%的数据,N≤1000000,Q≤3000,1≤W≤1000,1≤C≤1,000,000,000。

Source

代码:
 #include<bits/stdc++.h>
using namespace std;
#define MAXN 1000010
int N,a[MAXN],h[MAXN],pos[MAXN],add[],block;
int read()
{
int s=,fh=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
return s*fh;
}
void cl(int k)
{
int l=(k-)*block+,r=min(k*block,N),i;
for(i=l;i<=r;i++)a[i]=h[i];
sort(a+l,a+r+);
}
void Add(int l,int r,int c)
{
int i;
if(pos[l]==pos[r])
{
for(i=l;i<=r;i++)h[i]+=c;
cl(pos[l]);
}
else
{
for(i=l;i<=pos[l]*block;i++)h[i]+=c;
for(i=(pos[r]-)*block+;i<=r;i++)h[i]+=c;
for(i=pos[l]+;i<=pos[r]-;i++)add[i]+=c;
cl(pos[l]);cl(pos[r]);
}
}
int Find(int k,int c)
{
int l=(k-)*block+,r=min(k*block,N),t=,mid;
while(l<=r)
{
mid=(l+r)/;
if(a[mid]<c)l=mid+;
else t=mid,r=mid-;
}
if(t==)return ;
return min(k*block,N)-t+;
}
int Query(int l,int r,int c)
{
int ans=,i;
if(pos[l]==pos[r])
{
for(i=l;i<=r;i++)if(h[i]+add[pos[i]]>=c)ans++;
}
else
{
for(i=l;i<=pos[l]*block;i++)if(h[i]+add[pos[i]]>=c)ans++;
for(i=(pos[r]-)*block+;i<=r;i++)if(h[i]+add[pos[i]]>=c)ans++;
for(i=pos[l]+;i<=pos[r]-;i++)ans+=Find(i,c-add[i]);
}
return ans;
}
int main()
{
int Q,i,m,L,R,W;
char fh[];
N=read();Q=read();
block=(int)sqrt(N);
for(i=;i<=N;i++)
{
h[i]=read();
pos[i]=(i-)/block+;
}
if(N==block*block)m=block;
else m=block+;
for(i=;i<=m;i++)cl(i);
for(i=;i<=Q;i++)
{
scanf("\n%s",fh);L=read();R=read();W=read();
if(fh[]=='M')Add(L,R,W);
else printf("%d\n",Query(L,R,W));
}
return ;
}

Bzoj 3343: 教主的魔法 分块,二分的更多相关文章

  1. BZOJ 3343&colon; 教主的魔法&lpar;分块&plus;二分查找&rpar;

    BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved:  ...

  2. Bzoj 3343&colon; 教主的魔法&lpar;分块&plus;二分答案&rpar;

    3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...

  3. BZOJ 3343&colon; 教主的魔法 &lbrack;分块&rsqb;【学习笔记】

    3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved: 526[Submit][Status][Discus ...

  4. bzoj 3343 教主的魔法 分块

    修改直接对整块打标记,两边暴力. 查询需要保证每个整块有序,所以在修改时排序就好啦 #include<cstdio> #include<cstring> #include&lt ...

  5. 【BZOJ3343】教主的魔法 分块&plus;二分

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

  6. bzoj 3343&colon; 教主的魔法

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 924  Solved: 402[Submit][Status][Discuss] Descriptio ...

  7. BZOJ——3343&colon; 教主的魔法 &vert;&vert; 洛谷—— P2801 教主的魔法

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

  8. BZOJ 3343教主的魔法

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

  9. BZOJ 3343 教主的魔法(分块)

    题意: 有一个1e6的数组,t次操作:将[l,r]内的值增加w,或者查询[l,r]内的值大于等于add的 思路: 分块,块大小为sqrt(n),每次只需要暴力头尾两块,中间的整块打标记, 对于查询查操 ...

随机推荐

  1. android SDK Manager 上载失败

    android SDK Manager 下载失败如题,利用android SDK Manager 无法下载各个版本的SDK,是最近无法连接上谷歌的服务器吗?我用了网上说的在C:\WINDOWS\sys ...

  2. SQL Server智能感知如何更新

    经常用sql server发现一个问题,比如说我刚刚添加个表或者字段,这时候在sqlserver里面写sql语句时,没有智能提示,这个问题我以前一直不是太注意.今天好好找了下解决方法,这里做下分享. ...

  3. 最大权闭合图 &amp&semi;&amp&semi; 【BZOJ】1497&colon; &lbrack;NOI2006&rsqb;最大获利

    http://www.lydsy.com/JudgeOnline/problem.php?id=1497 最大权闭合图详细请看胡伯涛论文<最小割模型在信息学竞赛中的应用>,我在这里截图它的 ...

  4. java:定义线程

    Thread是java.lang包的类,默认导入. 进程:操作系统中的程序,多进程即同时运行多个程序.线程:程序中的流,多线程即程序中有多个流同时执行. 一个线程用一个线程对象表示 创建线程的方法: ...

  5. poj1637--Sightseeing tour(最大流)

    最大流求混合图是否存在欧拉回路. 以下内容摘自http://www.cnblogs.com/Missa/archive/2012/12/05/2803107.html 讲的很清楚. 混合图的欧拉回路问 ...

  6. Jasper&lowbar;table&lowbar;resolve get multiple copies of table in detail band issue

    resolve method: (1) put table component into the Title band / Page Header band / Summary band, not i ...

  7. Python基础篇&lpar;二&rpar;

    Python最基本的数据结构是序列(sequence),序列中的每个元素被分以以0开头的唯一的一个id号. Python中有6种内建的序列:列表,元组,字符串,Unicode字符串,buffer对象和 ...

  8. html 点击复制

    <span>集团登陆:</span> <input readonly id="jituan" type="text" value= ...

  9. 《Language Implementation Patterns》之 数据聚合符号表

    本章学习一种新的作用域,叫做数据聚合作用域(data aggregate scope),和其他作用域一样包含符号,并在scope tree里面占据一个位置. 区别在于:作用域之外的代码能够通过一种特殊 ...

  10. PNG&comma;JPEG&comma;BMP&comma;JIF图片格式详解及其对比

    原文地址:http://blog.csdn.net/u012611878/article/details/52215985 图片格式详解 不知道大家有没有注意过网页里,手机里,平板里的图片,事实上,图 ...