[BZOJ3343]教主的魔法
[BZOJ3343]教主的魔法
试题描述
输入
输出
输入示例
A
M
A
输出示例
数据规模及约定
对30%的数据,N≤1000,Q≤1000。
对100%的数据,N≤1000000,Q≤3000,1≤W≤1000,1≤C≤1,000,000,000。
题解
这题询问较少,但 N 比较大,可以往 O(Q√n) 复杂度的算法这个方向去想,况且这个题目用数据结构很难维护,所以就会想到分块。
想到分块之后就很简单了,每个块内部排一遍序,整块查询时可以二分,边上两块就可以暴力处理了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std; const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {
if(Head == Tail) {
int l = fread(buffer, 1, BufferSize, stdin);
Tail = (Head = buffer) + l;
}
return *Head++;
}
int read() {
int x = 0, f = 1; char c = Getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }
return x * f;
} #define maxn 1000010
#define maxb 1010
int n, q, A[maxn], Blo[maxn], st[maxb], en[maxb], addv[maxb], cb, pos[maxn]; void update(int l, int r, int val) {
int bl = pos[l], br = pos[r];
if(br - bl < 2) {
for(int i = st[bl]; i <= en[br]; i++) A[i] += addv[pos[i]]; addv[bl] = addv[br] = 0;
for(int i = l; i <= r; i++) A[i] += val;
for(int i = st[bl]; i <= en[br]; i++) Blo[i] = A[i];
sort(Blo + st[bl], Blo + en[bl] + 1);
sort(Blo + st[br], Blo + en[br] + 1);
return ;
}
for(int i = st[bl]; i <= en[bl]; i++) A[i] += addv[bl]; addv[bl] = 0;
for(int i = st[br]; i <= en[br]; i++) A[i] += addv[br]; addv[br] = 0;
for(int i = l; i <= en[bl]; i++) A[i] += val;
for(int i = st[br]; i <= r; i++) A[i] += val;
for(int i = st[bl]; i <= en[bl]; i++) Blo[i] = A[i]; sort(Blo + st[bl], Blo + en[bl] + 1);
for(int i = st[br]; i <= en[br]; i++) Blo[i] = A[i]; sort(Blo + st[br], Blo + en[br] + 1);
for(int i = bl + 1; i <= br - 1; i++) addv[i] += val;
return ;
}
int query(int l, int r, int val) {
int bl = pos[l], br = pos[r], ans = 0;
if(br - bl < 2) {
for(int i = st[bl]; i <= en[br]; i++) A[i] += addv[pos[i]], Blo[i] += addv[pos[i]];
addv[bl] = addv[br] = 0;
for(int i = l; i <= r; i++) ans += (A[i] >= val);
return ans;
}
for(int i = st[bl]; i <= en[bl]; i++) A[i] += addv[bl], Blo[i] += addv[bl]; addv[bl] = 0;
for(int i = st[br]; i <= en[br]; i++) A[i] += addv[br], Blo[i] += addv[br]; addv[br] = 0;
for(int i = l; i <= en[bl]; i++) ans += (A[i] >= val);
for(int i = st[br]; i <= r; i++) ans += (A[i] >= val);
for(int i = bl + 1; i <= br - 1; i++) {
int x = lower_bound(Blo + st[i], Blo + en[i] + 1, val - addv[i]) - Blo;
if(Blo[x] >= val - addv[i]) x--;
if(en[i] > x) ans += en[i] - x;
}
return ans;
} int main() {
n = read(); q = read();
int t = (int)(sqrt(n) + .5);
for(int i = 1; i <= n; i++) {
A[i] = Blo[i] = read();
int ni = (i - 1) / t + 1; cb = ni;
if(!st[ni]) st[ni] = i; en[ni] = i;
pos[i] = ni;
} for(int i = 1; i <= cb; i++) sort(Blo + st[i], Blo + en[i] + 1);
while(q--) {
char tp = Getchar();
while(!isalpha(tp)) tp = Getchar();
int ql = read(), qr = read(), val = read();
if(tp == 'M') update(ql, qr, val);
if(tp == 'A') printf("%d\n", query(ql, qr, val));
} return 0;
}
教主的这个魔法能不能在我身上用一下啊 QAQ
[BZOJ3343]教主的魔法的更多相关文章
- BZOJ3343: 教主的魔法 分块
2016-05-28 10:27:19 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3343 比较显然的分块题,分块后块内排序,维护整块的附 ...
- 【分块】bzoj3343: 教主的魔法
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 631 Solved: 272[Submit][Status][Discuss ...
- bzoj千题计划154:bzoj3343: 教主的魔法
http://www.lydsy.com/JudgeOnline/problem.php?id=3343 high记录原始身高 HIGH记录每块排序之后的身高 不满一块的直接对high操作,重排之后再 ...
- bzoj3343: 教主的魔法 分块 标记
修改:两边暴力重构,中间打标记.复杂度:O(n0.5) 查询:中间二分两边暴力.O(n0.5logn0.5) 总时间复杂度O(n*n0.5logn0.5) 空间复杂度是n级别的 标记不用下传因为标记不 ...
- [bzoj3343]教主的魔法——分块
Brief description 给定一个数列,您需要支持一下两种操作: 给[l,r]同加一个数 询问[l,r]中有多少数字大于或等于v Algorithm analyse 这个题一时想不到什么有效 ...
- bzoj3343 教主的魔法【分块入门】By cellur925
题意:维护一个数列,给出维护区间加法,询问区间内大于等于某个值的元素个数. 算法:分块.因为本题第二问显然可以用二分的思想,但是这貌似并不符合区间可加性,线段树好像就不好用了呢.所以本蒟蒻学习了分块. ...
- BZOJ-3343教主的魔法+分块(大块排序二分)
传送门:https://www.luogu.org/problemnew/show/P2801 参考:http://hzwer.com/2784.html 感觉思路无比清晰:) ps:我在洛谷A的, ...
- 【bzoj3343】教主的魔法 分块
[bzoj3343]教主的魔法 2014年4月26日8092 Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了 ...
- 【BZOJ-3343】教主的魔法 分块
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 950 Solved: 414[Submit][Status][Discuss ...
随机推荐
- mongo里面根据对象字段的ID查询 db.Photo.find({'owner.$id':ObjectId('xxxx')}) , 并且使用forEach循环修改查询的数据
var ones = db.Photo.find({'owner.$id':ObjectId("5344f0dab7c58e8e098b4567")}) db.Photo.find ...
- 支持Json进行操作的Javascript类库TAFFY DB
前段时间工作中用到Json数据,希望将一些简单的增删改查放到客户端来做,这样也能减少服务器端的压力.分别查找了几个可以对Json进行操作的javascript 类库,最终选定了TAFFY DB.原因如 ...
- SequoiaDB 系列源码分析调整
犹豫我经验尚不够丰富,有大牛跟我说,以我这样定下的结构来分析源码,学习效果不太好. 应该先从程序的进程入口函数开始,慢慢的跟流程来分析.先通过系统的启动.退出来分析所用到的技术,像进程模型,线程模型等 ...
- jQuery理解之(二)功能函数
在javascript编程中,开发者通常需要编写很多小程序来实现一些特定的功能.例如浏览器检测,字符串处理.数组的编辑等.jQuery对这些常用的程序进行了总结,提供了很多实用的函数. 1.检测浏览器 ...
- zabbix_agent安装(Centos+Ubuntu)
Centos安装 安装依赖包 yum -y install mysql-devel libcurl-devel net-snmp-devel 添加用户 groupadd zabbix use ...
- Weblogic 启动报错:java.lang.NoClassDefFoundError
Weblogic 启动报错:java.lang.NoClassDefFoundError ####<2015-6-17 下午03时30分47秒 CST> <Error> &l ...
- Mathematical operation
(1)Using let let result=2+1 let result=2-1 let result=2*1 let result=2/1(2) Using bracket echo $(($p ...
- Gallery 图片画廊
Gallery 图片画廊 学习网址http://amazeui.org/widgets/gallery?_ver=2.x
- CSU 1113 Updating a Dictionary
传送门 Time Limit: 1000MS Memory Limit: 131072KB 64bit IO Format: %lld & %llu Description In th ...
- UVA1262Password(第K字典序)
题目链接 紫书P323 题意:两个6*5的字母矩阵,两个矩阵每列相同的字母,每列取一个,求按照字典序第k小的序列 分析: 对于第一个样例来说,我们得到{ACDW}.{BOP}.{GMOX}.{AP}. ...