LGP2801 教主的魔法
题目链接 : P2801 教主的魔法
这是第一次A分块的题
就是模板题了
每个块内排序 每个整块仅需维护整块的修改量
询问操作:
对于边缘块 直接暴力找在[l, r]内 且比给定值大的有几个
对于整块 二分查找不小于 (给定值 - 本块修改量) 的块有多少个
修改操作:
边缘块直接修改
整块在修改量标记上修改
本题细节较多 尤其是修改和询问的范围
【明明是蒟蒻不熟练。。。
附上代码:
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 1e6 + ;
struct Node{
int bl, id;
long long x;
}node[N];
int n, blo, q, ts;
long long atag[N];//修改量标记 bool rule1(Node a, Node b){
return a.x < b.x;
}
//把[a, b]的元素加c
void add(int a, int b, long long c){
for(int i = (node[a].bl - ) * blo + ; i <= min(b, min(n, node[a].bl * blo)); i++)
if(node[i].id >= a)
node[i].x += c;
sort(node + (node[a].bl - ) * blo + , node + min(n, node[a].bl * blo) + , rule1);
if(node[a].bl != node[b].bl)
for(int i = (node[b].bl - ) * blo + ; i <= min(n, node[b].bl * blo); i++)
if(node[i].id <= b)
node[i].x += c;
sort(node + (node[b].bl - ) * blo + , node + min(n, node[b].bl * blo) + , rule1);
for(int i = node[a].bl + ; i <= node[b].bl - ; i++)
atag[i] += c;
}
//二分查找pos块中比a大的元素个数
int find(int pos, long long a){
if(a > node[min(n, pos * blo)].x) return ;
int l = (pos - ) * blo + , r = min(n, pos * blo), mid;
while(l < r){
mid = l + ((r - l) >> );
if(node[mid].x >= a) r = mid;
else l = mid + ;
}
return min(n, pos * blo) - l + ;
}
//询问 [a, b]中大于等于c的元素个数
int query(int a, int b, long long c){
int ans = ;
for(int i = (node[a].bl - ) * blo + ; i <= min(b, min(n, node[a].bl * blo)); i++)
if(node[i].id >= a && node[i].x >= c - atag[node[a].bl])
ans++; if(node[a].bl != node[b].bl)
for(int i = (node[b].bl - ) * blo + ; i <= min(n, node[b].bl * blo); i++)
if(node[i].id <= b && node[i].x >= c - atag[node[b].bl])
ans++; for(int i = node[a].bl + ; i <= node[b].bl - ; i++)
ans += find(i, c - atag[i]);
return ans;
} int main(){
scanf("%d%d", &n, &q);
blo = sqrt(n);
for(int i = ; i <= n; i++) scanf("%d", &node[i].x);
//输入
for(int i = ; i <= n; i++){
node[i].bl = (i - ) / blo + ;
node[i].id = i;
}
for(int i = ; i <= node[n].bl; i++)
sort(node + (i - ) * blo + , node + min(n, i * blo) + , rule1);
//块的分配与块内排序
char op[];
int x, y, z;
for(int i = ; i <= q; i++){
scanf("%s%d%d%d", op, &x, &y, &z);
if(op[] == 'M') add(x, y, z);
else printf("%d\n", query(x, y, z));
}
return ;
}
LGP2801 教主的魔法的更多相关文章
- 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 MBSubmit: 950 Solved: 414[Submit][Status][Discuss ...
- 【BZOJ3343】教主的魔法 分块+二分
Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的 ...
- BZOJ3343: 教主的魔法 分块
2016-05-28 10:27:19 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3343 比较显然的分块题,分块后块内排序,维护整块的附 ...
- [BZOJ3343]教主的魔法
[BZOJ3343]教主的魔法 试题描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.… ...
- 【bzoj3343】教主的魔法 分块
[bzoj3343]教主的魔法 2014年4月26日8092 Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了 ...
- c++之路进阶——bzoj3343(教主的魔法)
F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser gryz2016 Logout 捐赠本站 Notice:由于本OJ ...
- 【分块】bzoj3343: 教主的魔法
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 631 Solved: 272[Submit][Status][Discuss ...
- BZOJ 3343教主的魔法
Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的 ...
随机推荐
- (第十三周)评论Final发布II
按课上展示的顺序对每组进行点评:(性能.功能.UI.部署) 1. Nice! 项目:约跑软件 软件操作的响应很快,俩人进行聊天时可以实现消息的及时传递.功能主要有:注册账号.登录.创建/删除跑步计划 ...
- 一个出色的表格(React实现__ES5语法)
本文主要是<React快速上手开发>一书中,第三章的内容代码整理,因为书中的代码零零散散,所以自己将整理了一下. 排序和编辑功能 <script> var header = [ ...
- 01-学习vue前的准备工作
起步 1.扎实的HTML/CSS/Javascript基本功,这是前置条件. 2.不要用任何的构建项目工具,只用最简单的<script>,把教程里的例子模仿一遍,理解用法.不推荐上来就直接 ...
- jvm 虚拟机内存模型
来源:https://blog.csdn.net/A_zhenzhen/article/details/77917991?locationNum=8&fps=1 https://blog ...
- Baby-Step-Giant-Step 很酷的算法
Baby-Step-Giant-Step BSGS算法用于解决形如: A ^ x ≡ B ( mod C ) 的问题. 学这个算法前需要具备以下知识:快速幂取模.扩展欧几里 ...
- PL/SQL编程--变量声明及赋值
declare v_price ,);--单价 v_usenum number;--水费字数 v_usenum2 number;--使用吨数 begin v_price:=2.45;--每吨单价 v_ ...
- CLOUD计算产品成本嵌套
1.产品入库单入库的半成品A (无单价) 2.其他出库单上(共耗的)出库的半成品A(无单价) 不管在同车间还是不同车间内都是认定为嵌套的,所以可以计算2遍成本,第1遍不考虑嵌套,第2遍就能计算进去了.
- docker 操作镜像的基本操作
以安装mysql为例 1.拉取镜像 docker pull mysql 错误的启动 [root@localhost ~]# docker run --name mysql01 -d mysql 42f ...
- mysql定时任务event——清理过期数据
需要删除数据的表名:t_req_log 建表sql CREATE TABLE `t_req_log` ( `id` ) NOT NULL AUTO_INCREMENT, `host` ) DEFAUL ...
- Operation not allowed on a unidirectional dataset错误?
关于网友提出的“ Operation not allowed on a unidirectional dataset错误?”问题疑问,本网通过在网上对“ Operation not allowed o ...