3343: 教主的魔法

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit:
950  Solved: 414
[Submit][Status][Discuss]

Description

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

Input

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

Output

       对每个“A”询问输出一行,仅含一个整数,表示闭区间 [L,
R] 内身高大于等于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

Solution

规规矩矩的分块,不过之前从没写过

其实非常好写,看完论文后,自己YY出了正确的姿势,不过一个小BUG调了一会..

首先分成$\sqrt n$块,对于每次询问,或修改$[l,r]$

如果$l$,$r$在同一块里,就暴力修改/查询

否则,对于$l$到块结尾/快开头到$r$,两端进行暴力处理,其余的处理整个块,记录整个块的变化量

对于此题的询问,对块的处理就是每个块排序,二分出位置即可(一开始用lower_bound写WA成狗)

启发:

if后面的else是紧跟上一个if的,注意不要使之弄混(一个小细节没注意恶心了会)

二分还是自己手写比较靠谱,不要总想着找捷径

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
#define maxn 1000100
int n,q,bll,bln;
int a[maxn],aa[maxn],pos[maxn],delta[maxn];
void rebuild(int x)
{
int l=(x-)*bll+,r=min(x*bll,n);
for (int i=l; i<=r; i++) aa[i]=a[i];
sort(aa+l,aa+r+);
}
int find(int x,int c)
{
int l=(x-)*bll+,r=min(x*bll,n),last=r;
while(l<=r)
{
int mid=(l+r)>>;
if (aa[mid]<c) l=mid+;
else r=mid-;
}
return last-l+;
}
void Add(int l,int r,int ad)
{
if (pos[l]==pos[r])
for (int i=l; i<=r; i++) a[i]+=ad;
else
{
for (int i=l; i<=pos[l]*bll; i++) a[i]+=ad;
for (int i=(pos[r]-)*bll+; i<=r; i++) a[i]+=ad;
}
rebuild(pos[l]),rebuild(pos[r]);
for (int i=pos[l]+; i<=pos[r]-; i++) delta[i]+=ad;
}
int Query(int l,int r,int c)
{
int ans=;
if (pos[l]==pos[r])
for (int i=l; i<=r; i++) if (a[i]+delta[pos[i]]>=c) ans++; else continue;
else
{
for (int i=l; i<=pos[l]*bll; i++) if (a[i]+delta[pos[i]]>=c) ans++;
for (int i=(pos[r]-)*bll+; i<=r; i++) if (a[i]+delta[pos[i]]>=c) ans++;
}
// rebuild(pos[l]),rebuild(pos[r]);
for (int i=pos[l]+; i<=pos[r]-; i++) ans+=find(i,c-delta[i]);
return ans;
}
int main()
{
n=read(); q=read(); bll=int(sqrt(n)); if (n%bll) bln=n/bll+;else bln=n/bll;//bln=ceil(1.0*n/bll);
// printf("%d %d \n",bll,bln);
for (int i=; i<=n; i++) a[i]=read(),aa[i]=a[i],pos[i]=(i-)/bll+;
for (int i=; i<=bln; i++) rebuild(i);
for (int i=; i<=q; i++)
{
char opt[]; int L,R,A;
// for (int j=1; j<=n; j++) printf("%d %d %d %d %d\n",j,pos[j],a[j],aa[j],delta[j]);
scanf("%s",opt); L=read(),R=read(),A=read();
if (opt[]=='M') Add(L,R,A);
if (opt[]=='A') printf("%d\n",Query(L,R,A));
}
return ;
}

不说了,好好一个程序,被SB错误坑的改成了这样....

【BZOJ-3343】教主的魔法 分块的更多相关文章

  1. BZOJ 3343: 教主的魔法(分块+二分查找)

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

  2. BZOJ 3343: 教主的魔法 [分块]【学习笔记】

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

  3. Bzoj 3343: 教主的魔法(分块+二分答案)

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

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

    3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 821  Solved: 364[Submit][Status][Discuss ...

  5. bzoj 3343 教主的魔法 分块

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

  6. BZOJ——3343: 教主的魔法 || 洛谷—— P2801 教主的魔法

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

  7. BZOJ 3343教主的魔法

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

  8. bzoj 3343: 教主的魔法

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

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

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

  10. [bzoj] 3343 教主的魔法 || 带修改分块

    原题 长度为n的序列,有两种操作: 1.[l,r]区间每个数+w 2.询问[l,r]区间有多少个数>c 记录lazy数组即可. #include<cstdio> #include&l ...

随机推荐

  1. Java核心技术点之动态代理

    本篇博文会从代理的概念出发,介绍Java中动态代理技术的使用,并进一步探索它的实现原理.由于个人水平有限,叙述中难免出现不清晰或是不准确的地方,希望大家可以指正,谢谢大家:) 一.概述 1. 什么是代 ...

  2. ASP.NET MVC铵钮Click后下载文件

    本篇Insus.NET练习的是FilePathResult和FileStreamResult操作.本篇也算是<如何把Json格式字符写进text文件中>http://www.cnblogs ...

  3. TinyFrame开篇:基于CodeFirst的ORM

    前言 做项目的这段时间,由于比较忙,一直没有机会闲下来思考.正好趁目前手头活儿轻松点,就花了一两天时间搭建了一个比较简单的框架,名称暂时就叫做:TinyFrame吧.顾名思义,就是微框架的意思.虽然这 ...

  4. Android -- Apk安装简诉

    安装涉及到如下几个目录 system/app  ​ 系统自带的应用程序,无法删除 data/app   用户程序安装的目录,有删除权限. 安装时把apk文件复制到此目录 ​ data/data  存放 ...

  5. 小记sql server临时表与表变量的区别

    临时表与表变量都可以起到“临时”的作用,那么两者主要的区别是什么呢? 这里不讨论创建方式,以及全局临时表.会话临时表这些,主要记录一下个人对两者的主要区别以及适用情况的看法,有什么不对或补充的地方,欢 ...

  6. PRML读书会第九章 Mixture Models and EM(Kmeans,混合高斯模型,Expectation Maximization)

    主讲人 网络上的尼采 (新浪微博: @Nietzsche_复杂网络机器学习) 网络上的尼采(813394698) 9:10:56 今天的主要内容有k-means.混合高斯模型. EM算法.对于k-me ...

  7. 网页中三角切边还半透明,现在的设计师越来越牛,css也要跟上啊

    需求 今天在群里看到一个需求,啊这种三角形缺角怎么做啊,还带半透明阴影的. 分析 要实现这个,可以用css做三角,网上找一下代码,像这样. 由于以前没有试过border能不能带透明,所以需要试验一下. ...

  8. C# 7.0 新特性2: 本地方法

    本文参考Roslyn项目中的Issue:#259. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...

  9. VI命令----用于检索

    装了个虚拟机Ubuntu,命令行模式用VI很不适应,需要学习! 1.vi 模式切换: Commond模式: 打开文件的默认模式,用ESC建切换到此模式 Insert模式: 按键:i 在光标前输入 a ...

  10. Android之Activity启动模式

    正常模式 每个应用都有一个任务栈,任务栈中保存着已创建的Activity,先创建的Activity先入栈,栈顶是当前正在显示的activity(running),这是正常模式下的Activity的管理 ...