分块+二分 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开发环境的熟悉 报告
Java开发环境的熟悉 实验内容 1.IDEA的安装过程 2.使用IDEA代替虚拟机运行.编译.调试Java程序 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)&g ...
- CSS3:不可思议的border属性
在CSS中,其border属性有很多的规则.对于一些事物,例如三角形或者其它的图像,我们仍然使用图片代替.但是现在就不需要了,我们可以用CSS形成一些基本图形,我分享了一些关于这方面的技巧. 1.正三 ...
- HTTPD解析介绍
配置文件全局介绍 (1)主配置文件:/etc/httpd/conf/httpd.conf 全局配置:Section 1: Global Environment 第33行 中心主机配置: Section ...
- 【Leetcode】445. Add Two Numbers II
You are given two non-empty linked lists representing two non-negative integers. The most significan ...
- i18n实现前端国际化(实例)
在今日的需求中需要利用 i18n 这个框架来实现前端的国家化操作,下图是实现效果: 点击选择框实现网页上语言的切换: 下面开始实现过程: 所需工具: - jquery-3.3.1.js 下载地址 ...
- 【数据库】mysql中复制表结构的方法小结
mysql中用命令行复制表结构的方法主要有一下几种: 1.只复制表结构到新表 ? 1 CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2 或者 ? 1 CREATE ...
- Python环境安装(Windows环境)
近半年来一直在用Python处理手头的工作.想想,Python确实是一门比较强大的语言,容易上手且功能强大, 基本上想做的工作都能找到别人提供的包. 目前主要在windows系统上办公,这里把wind ...
- stm32中使用#pragma pack(非常有用的字节对齐用法说明)
#pragma pack(4) //按4字节对齐,但实际上由于结构体中单个成员的最大占用字节数为2字节,因此实际还是按2字节对齐 typedef struct { char buf[3];//bu ...
- CF816E-Karen and Supermarket
题目 Description 今天Karen要去买东西. 一共有 \(n\) 件物品,每件物品的价格为\(c_i\),同时每件物品都有一张优惠券,可以对这件物品减价 \(d_i\) . 使用第 \(i ...
- BZOJ 2109 航空管制(拓扑排序+贪心)
绝世好题啊.. 题意:给出一个DAG,和每个点要求出现在这个DAG里面的拓扑排序的位置<=ti,求出所有可能的拓扑排序里面每个点出现的位置的最小值. 正着做不好做,考虑反着做,建立这个图的反图. ...