BZOJ-3343教主的魔法+分块(大块排序二分)
传送门:https://www.luogu.org/problemnew/show/P2801
参考:http://hzwer.com/2784.html 感觉思路无比清晰;)
ps:我在洛谷A的,BZOJ要权限;
题意:区间查询有多少个比K的数;
思路:分块,两边暴力更新与查询,中间查询是用二分计数;每次更新,如有必要,要记得重新sort(区间对应的另一个数组);
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;
const int maxn = ;
const int bmaxn = ;
ll a[maxn],b[maxn],add[bmaxn];
int n,m; int belong[maxn];
int num,l[bmaxn],r[bmaxn]; //块个数;i这块的左端;i这块的右端
int block; //块大小 void reset(int id)
{
int le = l[id],ri = r[id];
for(int i=le; i<=ri; i++)b[i] = a[i];
sort(b+le,b+ri+);
} void build()
{
block = sqrt(n);
num = n/block;if(n%block)num++;
for(int i=; i<=num; i++)
l[i]=(i-)*block+,r[i] = i * block;
r[num] = n;
for(int i=; i<=n; i++)
belong[i] = (i-)/block + ;
for(int i=; i <= num; i++)
reset(i);
} void update(int lx,int rx,ll val)
{
if(belong[lx]==belong[rx])
{
for(int i=lx;i<=rx;i++)a[i]+=val;
reset(belong[lx]);
}
else
{
int li = r[belong[lx]],ri = l[belong[rx]];
for(int i = lx; i<=li; i++)a[i]+=val;
reset(belong[lx]);
for(int i = ri; i<=rx; i++)a[i]+=val;
reset(belong[rx]);
for(int i = belong[lx] + ;i < belong[rx]; i++)add[i]+=val;
}
} ll query(int lx,int rx,ll k)
{
ll res = ;
if(belong[lx]==belong[rx])
{
for(int i=lx;i<=rx;i++)if(a[i] >= k - add[belong[lx]])res++;
}
else
{
int li = r[belong[lx]],ri = l[belong[rx]];
// cout<<li<<" "<<ri<<endl;
for(int i = lx; i <= li; i++) if(a[i] >= k-add[belong[lx]])res++;
for(int i = ri; i <= rx; i++) if(a[i] >= k-add[belong[rx]])res++;
for(int i = belong[lx] + ; i<belong[rx]; i++)
{
int le = l[i],ri = r[i];
while(le <= ri)
{
int mid = (le+ri)>>;
if(b[mid] < k - add[i])
le = mid + ;
else ri = mid - ;
}
// printf("%d\n",le);
// cout<<r[i]-le+1<<endl;
res+=r[i] - le + ;
}
}
return res;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
scanf("%lld", &a[i]);
build();
for(int i=; i<=m; i++)
{
char s[];
int x,y;
ll v;
scanf("%s%d%d%lld",s,&x,&y,&v);
if(s[]=='M')
{
update(x,y,v);
}
else
{
ll ans = query(x,y,v);
printf("%lld\n",ans);
}
}
return ;
}
BZOJ-3343教主的魔法+分块(大块排序二分)的更多相关文章
- BZOJ 3343: 教主的魔法(分块+二分查找)
BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: ...
- BZOJ 3343: 教主的魔法 [分块]【学习笔记】
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: 526[Submit][Status][Discus ...
- Bzoj 3343: 教主的魔法(分块+二分答案)
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...
- Bzoj 3343: 教主的魔法 分块,二分
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 821 Solved: 364[Submit][Status][Discuss ...
- bzoj 3343 教主的魔法 分块
修改直接对整块打标记,两边暴力. 查询需要保证每个整块有序,所以在修改时排序就好啦 #include<cstdio> #include<cstring> #include< ...
- BZOJ——3343: 教主的魔法 || 洛谷—— P2801 教主的魔法
http://www.lydsy.com/JudgeOnline/problem.php?id=3343 || https://www.luogu.org/problem/show?pid=280 ...
- BZOJ 3343教主的魔法
Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的 ...
- bzoj 3343: 教主的魔法
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 924 Solved: 402[Submit][Status][Discuss] Descriptio ...
- BZOJ 3343 教主的魔法(分块)
题意: 有一个1e6的数组,t次操作:将[l,r]内的值增加w,或者查询[l,r]内的值大于等于add的 思路: 分块,块大小为sqrt(n),每次只需要暴力头尾两块,中间的整块打标记, 对于查询查操 ...
- [bzoj] 3343 教主的魔法 || 带修改分块
原题 长度为n的序列,有两种操作: 1.[l,r]区间每个数+w 2.询问[l,r]区间有多少个数>c 记录lazy数组即可. #include<cstdio> #include&l ...
随机推荐
- H5 video自定义视频控件
1.自定义效果截图 2.效果源码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...
- TCP报文指针解释,IP地址
三次握手TCP报文指针内容: 1.URG:紧急指针,当URG=1,表明紧急指针字段有效,告诉系统报文有紧急内容. 2.ACK: 确认指针,当ACK=1,确认号字段有效. 3.PSH:推送指针,当两个 ...
- 【iOS】receiver type *** for instance message is a forward declaration
错误原因:没有引入相关的头文件 http://stackoverflow.com/questions/8815200/receiver-type-for-instance-message-is-a-f ...
- MySQL中一些关于索引的知识点
什么是索引 索引是一种数据结构,其作用就是用来提高数据查询效率.比较常用的比喻就是将其类比为书籍的目录.通过目录可以精确的找到某一章节的内容所在页. 在数据量较小的时候使用索引其实也没有什么意义,即使 ...
- 派胜OA二次开发笔记(1)重写主界面
最近从派胜OA 2018 升级到 2019,为了二次开发方便,索性花了两天,反向分析 PaiOA 2019 主界面程序,重写大部分代码,方便对菜单权限进行控制. 主界面/core/index.aspx ...
- 利用jQuery中的serialize方法大量获取页面中表单的数据,发送的服务器
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Oracle jdbc 插入 clob blob
Oracle 使用 clob 与 blob 插入一些比较庞大的文本或者文件,JDBC 插入时 也比较简单 表结构 CREATE TABLE test_info ( user_id int NOT NU ...
- 【Kubernetes 系列二】从虚拟机讲到 Kubernetes 架构
目录 什么是虚拟机? 什么是容器? Docker Kubernetes 架构 Kubernetes 对象 基础设施抽象 在认识 Kubernetes 之前,我们需了解下容器,在了解容器之前,我们得先知 ...
- ES 26 - 通过partial update局部更新索引文档 (partial update增量修改原理)
目录 1 什么是partial update 1.1 全量修改文档的原理 1.2 修改指定field的思路 1.3 partial update的优势 1.4 partial update的使用 2 ...
- Spark 系列(十五)—— Spark Streaming 整合 Flume
一.简介 Apache Flume 是一个分布式,高可用的数据收集系统,可以从不同的数据源收集数据,经过聚合后发送到分布式计算框架或者存储系统中.Spark Straming 提供了以下两种方式用于 ...