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 ...
随机推荐
- Git 从master拉取代码创建新分支
从master拉取新分支并push到远端 开发过程中经常用到从master分支copy一个开发分支: 1.切换到被copy的分支(master),并且从远端拉取最新版本 $git checkout m ...
- codeforces 347A - Difference Row
给你一个序列,让你求(x1 - x2) + (x2 - x3) + ... + (xn - 1 - xn).值最大的一个序列,我们化简一下公式就会发现(x1 - x2) + (x2 - x3) + . ...
- MOCTF-WEB-writeup
MOCTF-WEB-writeup 好菜,除了简单的几个题,自己会做,难的都是看老大WP完成的,太菜了 啥姿势都不会,就此记录一下,供日后查看及反省.菜鸡的自我修养 0x01 一道水题 题目链接:ht ...
- js中数组和对象的合并
1 数组合并 1.1 concat 方法 1 2 3 4 var a=[1,2,3],b=[4,5,6]; var c=a.concat(b); console.log(c);// 1,2,3,4,5 ...
- 夯实Java基础(六)——包装类
1.包装类简介 我们都知道Java是面向对象编程语言,包含了8种基本数据类型,但是这8种基本数据类型并不支持面向对象的特征,它们既不是类,也不能调用方法.这在实际使用时存在很多的不便,比如int类型需 ...
- 个人使用的lilypond第一个模板
手残非要用lilypond打谱真是…… 可是lilypond又能满足各种细节标记和谱文混排,这是musescore达不到的 所以还是开这个坑,希望能逐渐自己有能力编写自己的音乐教材 个人用Fresco ...
- (一)Mybatis基本配置,Statement方式,动态代理增删改查
首先明白Mybatis是干什么的,之前使用jdbc操作数据库时候要写很多语句,获取光标,连接,获取具体对象进行相应操作,代码过于繁琐,所以现在有了Mybatis,它将这个操作整合在了一起,你不需要关心 ...
- Jquery 实现添加删除,checkbok 的全选,反全选,但是批量删除没有实现
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title& ...
- 【作品】超实用C++分数类
引言 我们说,编程语言的精髓在于封装,而面向对象语言完胜面向过程语言的原因就是具有更好的可封装性,而C++就是这样的一种多范型语言,常用而复杂的工作完全不必在每一份源文件中重敲,就好像我们不需要自己手 ...
- 理解MySQL(一)--MySQL介绍
一.Mysql逻辑架构: 1. 第一层:服务器层的服务,连接\线程处理. 2. 第二层:查询执行引擎,MySQL的核心服务功能,包括查询解析.分析.优化和缓存,所有跨存储引擎的功能都在这一层实现. 3 ...