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. 每个人的 ...
随机推荐
- Day9 Python基础之函数基础(七)
参考链接:https://www.cnblogs.com/yuanchenqi/articles/5828233.html 1.函数的定义 定义: 函数是指将一组语句的集合通过一个函数名封装起来,要想 ...
- BOM、DOM
window对象 所有浏览器都支持window对象,他表示浏览器窗口. 全局变量是window对象的属性.全局函数是window对象的方法. window的常用方法: window.innerHeig ...
- gethostbyname用法
//会优先查询解析%windir%\system32\drivers\etc\hosts中静态dns表 //一个域名可对应多个IP hostent->h_addr_list ==> 是in ...
- Jmeter之Constant Timer与constant throughput timer的区别(转)
当放置Constant Timer于两个http请求之间,那么它代表的含义是:在上一个请求发出至完成后, 开始Contant Timer指定的时间,最后再发出第二个请求.它并不是代表两个请求之间的发送 ...
- jdk环境变量配置注意事项
cmd 运行java -version 显示错误 Registry key 'Software\JavaSoft\Java Runtime Environment\CurrentVersion'has ...
- [转帖]SAP S/4 HANA与SAP Business Suite/R3(ECC)的区别
SAP S/4 HANA与SAP Business Suite/R3(ECC)的区别 https://blog.csdn.net/zhongguomao/article/details/5351520 ...
- 使用Elasticsearch 出现的拒绝连接
pom 文件 spring: elasticsearch: jest: uris: http://192.168.124.142:9201 # data: # elasticsearch: # clu ...
- 【转】说说MySQL中的Redo log Undo log都在干啥
阅读目录(Content) 1 undo 1.1 undo是啥 1.2 undo参数 1.3 undo空间管理 2 redo 2.1 redo是啥 2.2 redo 参数 2.3 redo 空间管理 ...
- jenkins的 git多分支自动构建
一.先做好jenkins和gitlab的webhook自动构建 二.选择哪个分支(我这是test分支) 三.选择build Triggers 四.过滤test分支 五.保存即可
- 集合之TreeSet(含JDK1.8源码分析)
一.前言 前面分析了Set接口下的hashSet和linkedHashSet,下面接着来看treeSet,treeSet的底层实现是基于treeMap的. 四个关注点在treeSet上的答案 二.tr ...