[luoguP2801] 教主的魔法(二分 + 分块)
以为对于这类问题线段树都能解决,分块比线段树菜,结果培训完才知道线段树是一种特殊的分块方法,有的分块的题线段树不能做,看来分块还是有必要学的。
对于这个题,先分块,然后另开一个数组对于每个块内排序。
区间加的话,加一个标记,每一个整块区间加,里面的数的相对大小不变,而左右两边零散的块直接暴力重构。
查询可以对于每个块二分查找。
时间复杂度应该是 nlogn + Q√nlog√n,刚好卡过。。
注意:第10个点会被卡,手写二分比stl的lower_bound快一点,可以避免被卡。
也可以在 S = sqrt(n) 后面 + x,x 不要太大也不要太小,不知道为什么,速度也会快点,玄学啊。
%%%有些dalao不知道怎么写的,1000ms
——代码(最终只能优化到1600ms)
#include <cmath>
#include <cstdio>
#include <iostream>
#include <algorithm>
#define LL long long const int MAXN = ;
int n, q, S, C;
int belong[MAXN], st[MAXN], ed[MAXN];
LL a[MAXN], b[MAXN], add[MAXN]; inline LL read()
{
LL x = , f = ;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
for(; isdigit(ch); ch = getchar()) x = x * + ch - '';
return x * f;
} inline int find(int x, int y, int z)
{
int mid;
while(x < y)
{
mid = (x + y) >> ;
if(b[mid] >= z) y = mid;
else x = mid + ;
}
return x;
} inline void retreat(int x, int y)
{
int i;
for(i = x; i <= y; i++) b[i] = a[i];
std::sort(b + x, b + y + );
} inline void init()
{
int i, j;
S = int(sqrt(n)) + ;
for(i = ; i <= n; i++) scanf("%d", &a[i]);
for(i = ; i <= n; i += S)
{
st[++C] = i;
ed[C] = std::min(i + S - , n);
}
for(i = ; i <= C; i++)
for(j = st[i]; j <= ed[i]; j++)
belong[j] = i;
for(i = ; i <= C; i++) retreat(st[i], ed[i]);
} inline void update(int x, int y, LL z)
{
int i, l = belong[x], r = belong[y];
if(l == r)
{
for(i = x; i <= y; i++) a[i] += z;
retreat(st[l], ed[r]);
}
else
{
for(i = x; i <= ed[l]; i++) a[i] += z;
for(i = l + ; i <= r - ; i++) add[i] += z;
for(i = st[r]; i <= y; i++) a[i] += z;
retreat(st[l], ed[l]);
retreat(st[r], ed[r]);
}
} inline int query(int x, int y, LL z)
{
int i, l = belong[x], r = belong[y], ans = ;
if(l == r) return y + - find(x, y + , z - add[l]);
ans += ed[l] - find(x, ed[l] + , z - add[l]) + ;
for(i = l + ; i <= r - ; i++) ans += ed[i] - find(st[i], ed[i] + , z - add[i]) + ;
ans += y - find(st[r], y + , z - add[r]) + ;
return ans;
} int main()
{
int i, j, x, y;
LL z;
char ch;
n = read();
q = read();
init();
for(i = ; i <= q; i++)
{
while ((ch=getchar()) < 'A' || ch > 'Z');
x = read();
y = read();
z = read();
if(ch == 'M') update(x, y, z);
else printf("%d\n", query(x, y, z));
}
return ;
}
[luoguP2801] 教主的魔法(二分 + 分块)的更多相关文章
- BZOJ_3343_教主的魔法_分块+二分查找
BZOJ_3343_教主的魔法_分块+二分查找 题意:教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列被编号为 ...
- P2801 教主的魔法(分块)
P2801 教主的魔法 区间加法,区间查询 显然就是分块辣 维护一个按块排好序的数组. 每次修改依然是整块打标记,零散块暴力.蓝后对零散块重新排序. 询问时整块二分,零散块暴力就好辣 注意细节挺多和边 ...
- BZOJ 3343:教主的魔法(分块)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3343 [题目大意] 给出一个数列,有区间加法操作,询问区间大于等于c的数字个数 [题解 ...
- 【Luogu】P2801教主的魔法(分块)
题目链接 激动qwq.这是我A的第一道分块. 分块之后对块内元素暴力sort.修改的时候对于整块打个标记,查询的时候只需要查C-tag就行了 对于非整块,暴力修改,改完之后sort 对于查询……非整块 ...
- bzoj3343 教主的魔法【分块入门】By cellur925
题意:维护一个数列,给出维护区间加法,询问区间内大于等于某个值的元素个数. 算法:分块.因为本题第二问显然可以用二分的思想,但是这貌似并不符合区间可加性,线段树好像就不好用了呢.所以本蒟蒻学习了分块. ...
- BZOJ 3343 教主的魔法(分块)
题意: 有一个1e6的数组,t次操作:将[l,r]内的值增加w,或者查询[l,r]内的值大于等于add的 思路: 分块,块大小为sqrt(n),每次只需要暴力头尾两块,中间的整块打标记, 对于查询查操 ...
- Luogu2801 教主的魔法 (分块)
与hzw的分块2类似,放vector排序 #include <iostream> #include <cstdio> #include <cstring> #inc ...
- 【BZOJ3343】教主的魔法 分块+二分
Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的 ...
- 洛谷P2801 教主的魔法 [分块,二分答案]
题目传送门 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. ...
随机推荐
- H5页面快速搭建之高级字体应用实践
原文出处: 淘宝前端团队(FED)- 龙驭 背景 最近在开发一个 H5 活动页快速搭建平台,可以通过拖拽编辑图片,文字等元素组件,快速搭建出一个移动端的活动页面,基本交互和成品效果类似 PPT 软件. ...
- Python 3.6.5安装过程中小错误zipimport.ZipImportError: can't decompress data; zlib not available
执行 :yum install -y zlib*之后,就好了.该安装错误是在CentOS7.4中遇到的.
- es6语法错误
哇,今天折腾了好久解决了一个问题,记录一下. 错误: 解决方法:配置babel,将es6语法转换成es5语法 1. 全局安装babel: npm install babel-cli -g 2. 本地安 ...
- 第十三周翻译:SQL Server安全级别1:SQL Server安全性概述
SQL Server安全级别1:SQL Server安全性概述 源自:Stairway to SQL Server Security Level 1: Overview of SQL Server S ...
- 深入解析Web Services
SOA,面向服务器建构,是一款架构,这几年虽然没前几年那么流行,但是还是有很多企业在用,而Web Services是目前适合做SOA的主要技术之一,通过使用Web Services,应用程序可以对外发 ...
- 30行代码消费腾讯人工智能开放平台提供的自然语言处理API
腾讯人工智能AI开放平台上提供了很多免费的人工智能API,开发人员只需要一个QQ号就可以登录进去使用. 腾讯人工智能AI开放平台的地址:https://ai.qq.com/ 里面的好东西很多,以自然语 ...
- Mysql is not allowed to connect mysql server
1. mysql -u root -p 2. select host from user where user='root'; //可以看到当前主机配置信息为localhost ...
- Python中Pickle模块的dump()方法和load()方法
Python中的Pickle模块实现了基本的数据序列与反序列化. 经常遇到在Python程序运行中得到了一些字符串.列表.字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就 ...
- 如何在一次请求中通过JS中获取Url中的参数
从A跳转到B,携带参数 例如: /pc/B.jsp?item=123456 B页面在js可以直接用 var item='${param.item}'; 这样就拿到啦 还有一种方法 定义一个函数 f ...
- 数位DP || Gym 101653R Ramp Number
每一位都大于等于前一位的数叫Ramp Number 给一个数,如果不是Ramp Number输出-1,如果是Ramp Number输出比它小的Ramp Number的个数 只和每一位上的数字有关 #i ...