分块+二分 BZOJ 3343
3343: 教主的魔法
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 1312 Solved: 585
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 3 4 5
A 1 5 4
M 3 5 1
A 1 5 4
Sample Output
3
HINT
Source
思路:
分块以后,对于每个询问区间[L,R],对于收尾两个区间进行暴力寻找即可。对于中间的块,我们提前进行排序然后进行二分寻找大于c-add[now_block_id]即可(因为每个块是sqrt(n)个元素,所以总的复杂度应该是n*sqrt(n)*log(n))
//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
const int maxn = + ;
int n, q;
int block, num, belong[maxn], L[maxn], R[maxn];
int add[maxn], a[maxn], d[maxn]; void build_block(){
block = sqrt(n * 1.0); 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++){
sort(d + L[i], d + R[i] + );
}
} void modify(int l, int r){
for (int i = l; i <= r; i++)
d[i] = a[i];
sort(d + l, d + r + );
} void update(int ql, int qr, int w){
if (belong[ql] == belong[qr]){
for (int i = ql; i <= qr; i++)
a[i] += w;
modify(L[belong[ql]], R[belong[ql]]);
return ;
}
for (int i = ql; i <= R[belong[ql]]; i++)
a[i] += w;
modify(L[belong[ql]], R[belong[ql]]); for (int i = L[belong[qr]]; i <= qr; i++)
a[i] += w;
modify(L[belong[qr]], R[belong[qr]]); for (int i = belong[ql] + ; i < belong[qr]; i++)
add[i] += w;
} int query(int ql, int qr, int c){
int ans = ;
if (belong[ql] == belong[qr]){
for (int i = ql; i <= qr; i++)
if (c - add[belong[ql]] <= a[i]) ans++;
return ans;
}
for (int i = ql; i <= R[belong[ql]]; i++)
if (c - add[belong[ql]] <= a[i]) ans++; for (int i = L[belong[qr]]; i <= qr; i++)
if (c - add[belong[qr]] <= a[i]) ans++;
for (int i = belong[ql] + ; i < belong[qr]; i++){
int l = L[i], r = R[i];
int p = lower_bound(d + l, d + r + , c - add[i]) - d;
ans += r + - p;
}
return ans;
} int main(){
cin >> n >> q;
for (int i = ; i <= n; i++){
scanf("%d", a + i);
d[i] = a[i];
}
build_block();
while (q--){
char ch[]; int a, b, c;
scanf("%s%d%d%d", ch, &a, &b, &c);
if (ch[] == 'A'){
printf("%d\n", query(a, b, c));
}
else update(a, b, c);
}
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 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...
- 【BZOJ 2453|bzoj 2120】 2453: 维护队列 (分块+二分)
2453: 维护队列 Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有 ...
- BZOJ_3343_教主的魔法_分块+二分查找
BZOJ_3343_教主的魔法_分块+二分查找 题意:教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列被编号为 ...
- 【bzoj2957】楼房重建 分块+二分查找
题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子.为了简化问题,我们考虑这些事件发生在一个二 ...
- 【bzoj2453】维护队列/【bzoj2120】数颜色 分块+二分
题目描述 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好, ...
- 【bzoj4889】[Tjoi2017]不勤劳的图书管理员 树状数组+分块+二分
题目描述(转自洛谷) 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被打 ...
- Bzoj 3343: 教主的魔法 分块,二分
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 821 Solved: 364[Submit][Status][Discuss ...
- BZOJ 3343: 教主的魔法 [分块]【学习笔记】
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: 526[Submit][Status][Discus ...
随机推荐
- Java中的抽象类abstract
abstract定义抽象类 abstract定义抽象方法,只需要声明,不需要实现 包含抽象方法的类是抽象类 抽象类中可以包含抽象方法,也可以包含普通方法 抽象类不能直接创建,可以定义父类引用变量指向子 ...
- 四则运算3+psp0
题目要求: 1.程序可以判断用户的输入答案是否正确,如果错误,给出正确答案,如果正确,给出提示. 2.程序可以处理四种运算的混合算式. 3.要求两人合作分析,合作编程,单独撰写博客. 团队成员:张绍佳 ...
- 周总结<4>
经过了一周的学习,我们在html以及C语言方面又有的新的知识点的学习. html 自习表格,函数等 C语言 哈弗曼编码 Html案例: 一. <!DOCTYPE html PUBLIC &quo ...
- J2EE体系
J2EE的概念 目前,Java 2平台有3个版本,它们是适用于小型设备和智能卡的Java 2平台Micro版(Java 2 Platform Micro Edition,J2ME).适用于桌面系统的J ...
- 重写JdbcRDD支持Sql命名参数和分区
Spark提供的JdbcRDD很不好用,没法指定命名参数,而且必须要提供两个Long类型的参数表示分区的范围,如果数据表没有long类型的字段或者不需要条件,那就不能用JdbcRDD了.这里我简单重写 ...
- IBM存储降级告警等一些服务器问题/dd/ethtool
1.IBM存储降级告警 一般两种情况 a.端口降级 例如模块16G->8G(IBM储存端口自适应) b.系统在作raid后,有硬盘损坏,降级 黄灯告警 2. dimm error dimm内存插 ...
- python脚本批量生成50000条插入数据的sql语句
f = open("xx.txt",'w') for i in range(1,50001): str_i = str(i) realname = "lxs"+ ...
- 在mvc4中上传、导入和导出excel表方法总结
通过excel的导入导出练习,使用NPOI组件还是方便一点,所有下面就以NPOI下的导入导出给出实例,通过网页导入excel表,首先上传,再导入数据到库,这里为了方便就不导入到库中了,直接拿到数据.导 ...
- asp.net mvc4+EF 下使用UEditor
一.从官方网站下载UEditor,http://ueditor.baidu.com/website/download.html, 我下载的是1.53.net版本
- 【51Nod1773】A国的贸易 FWT+快速幂
题目描述 给出一个长度为 $2^n$ 的序列,编号从0开始.每次操作后,如果 $i$ 与 $j$ 的二进制表示只差一位则第 $i$ 个数会加上操作前的第 $j$ 个数.求 $t$ 次操作后序列中的每个 ...