【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=3343

【题目大意】

  给出一个数列,有区间加法操作,询问区间大于等于c的数字个数

【题解】

  我们将数据分块,区间加法等价于各个块整块加法以及首位部分的个体加法,
  由于要查询区间大于等于c的数字个数,
  因此我们在每个块发生相对大小变动的时候对块内元素映射进行一次排序,
  因为每次只有最左和最右的块相对大小发生变动,因此修改操作仍为O(sqrt(n))
  查询时我们二分查找每个块中满足大小的个数,查询复杂度O(sqrt(n)log(sqrt(n)))
  总复杂度O(qsqrt(n)log(sqrt(n))。

【代码】

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int n,m,q,block;
const int N=1000010;
int a[N],b[N],pos[N],add[N];
void Sortblock(int x){
int l=(x-1)*block+1,r=min(x*block,n);
for(int i=l;i<=r;i++)b[i]=a[i];
sort(b+l,b+r+1);
}
int find(int x,int v){
int l=(x-1)*block+1,r=min(x*block,n);
int R=r;
while(l<=r){
int mid=(l+r)>>1;
if(b[mid]<v)l=mid+1;
else r=mid-1;
}return R-l+1;
}
void update(int x,int y,int v){
if(pos[x]==pos[y]){for(int i=x;i<=y;i++)a[i]+=v;}
else{
for(int i=x;i<=pos[x]*block;i++)a[i]+=v;
for(int i=(pos[y]-1)*block+1;i<=y;i++)a[i]+=v;
}Sortblock(pos[x]);Sortblock(pos[y]);
for(int i=pos[x]+1;i<pos[y];i++)add[i]+=v;
}
int query(int x,int y,int v){
int res=0;
if(pos[x]==pos[y]){for(int i=x;i<=y;i++)if(a[i]+add[pos[i]]>=v)res++;}
else{
for(int i=x;i<=pos[x]*block;i++)if(a[i]+add[pos[i]]>=v)res++;
for(int i=(pos[y]-1)*block+1;i<=y;i++)if(a[i]+add[pos[i]]>=v)res++;
}for(int i=pos[x]+1;i<pos[y];i++)res+=find(i,v-add[i]);
return res;
}
int main(){
while(~scanf("%d%d",&n,&q)){
block=int(sqrt(n));
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
pos[i]=(i-1)/block+1;
b[i]=a[i];
}
if(n%block)m=n/block+1;
else m=n/block;
for(int i=1;i<=m;i++)Sortblock(i);
for(int i=1;i<=q;i++){
char op[5];
int x,y,v;
scanf("%s%d%d%d",op,&x,&y,&v);
if(op[0]=='M')update(x,y,v);
else printf("%d\n",query(x,y,v));
}
}return 0;
}

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. Maven整体认识——详细介绍

    前言 本文可以帮助你加深对Maven的整体认识,不是一篇基础文章.如果你现在还没有用 Maven 跑过 HelloWorld,那么本文可能不适合你. 一.Maven简介 Maven 官网:https: ...

  2. 【洛谷 P4735】 最大异或和 (可持久化Trie)

    题目链接 维护整个数列的异或前缀和和\(s\),然后每次就是要求\(s[N]\text{^}x\text{^}s[k],l-1<=k<=r-1\)的最大值 如果没有\(l\)的限制,那么直 ...

  3. 多种方法过Codeforces Round #270的A题(奇偶法、打表法和Miller_Rabin(这个方法才是重点))

    题目链接:http://codeforces.com/contest/472/problem/A 题目: 题意:哥德巴赫猜想是:一个大于2的素数一定可以表示为两个素数的和.此题则是将其修改为:一个大于 ...

  4. Codeforces Round #482 (Div. 2) B题

    题目链接:http://codeforces.com/contest/979/problem/B B. Treasure Hunt time limit per test1 second memory ...

  5. java 连接数据库报错:Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '

    1.解决方法: 报错信息为: Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server ti ...

  6. Windows下基于python3使用word2vec训练中文维基百科语料(一)

    在进行自然语言处理之前,首先需要一个语料,这里选择维基百科中文语料,由于维基百科是 .xml.bz2文件,所以要将其转换成.txt文件,下面就是相关步骤: 步骤一:下载维基百科中文语料 https:/ ...

  7. 9.1docker容器 跨主机连接

    open vswitch 实现跨主机容器连接          准备条件   将本地的网卡 与新建的网桥建立连接   配置 docker 启动项       weave实现跨主机容器连接   null

  8. linux进程管理-定时定期执行任务

     0.计划任务的命令: at 安排作业在某一时刻执行 batch 安排作业在系统负载不重时执行 crontab 安排周期性运行的作业 1.at命令用法: 安排命令或者多个命令在指定的时间运行一次 语法 ...

  9. 【Windows使用笔记】使Onedrive同步任意文件夹

    因为度盘实在是有点垃圾,经常看的剧之类的或者其他软件资源啥的动不动就被封. 所以跑去某宝买了一个5T的企业子账号,安全性不清楚,重要的隐私数据反正都用移动硬盘备份了.主要就是存一些资源性的文件吧.而且 ...

  10. docker数据管理--数据卷的备份

    /* 先在宿主机创建一个备份的文 件夹, 然后将其以另外一个名字的目录挂载到容器里, 此时不管容器里,或宿主机里做什么操作, 数据都会及时更新,并得到备份. */ [root@localhost ~] ...