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. 每个人的 ...
随机推荐
- 广州商学院16级软工一班&二班-第一次作业成绩
广州商学院16级软工一班&二班-第一次作业成绩 作业地址 16软工一班 16软工二班 总结 本次作业反映了几个比较严重的问题: 不按要求阅读相应的文章,回答问题只是敷衍几句. 部分同学的版式混 ...
- 一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录
1.如果A表TID是自增长,并且是连续的,B表的ID为索引 select * from a,b where a.tid = b.id and a.tid>500000 limit 200; 2. ...
- java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloader
我的解决办法: 1.如果是application工程,则在程序中打印出 system.out.println(System.getProperty("java.endo ...
- Composer之搭建自己的包工具
作为一个标准的PHPer,必须学会优雅的使用composer,最近,萌生了一个想法,我们每搭建一个项目,里面都会有许多的公用的方法和类库,每次使用的时候就是将其拷贝过来,或者重新写一遍,过于繁琐,效率 ...
- Windows Docker 安装
win7.win8 .win10等需要利用 docker toolbox 来安装,国内可以使用阿里云的镜像来下载,下载地址:http://mirrors.aliyun.com/docker-toolb ...
- mysql数据库在linux上的不同登录方式和权限
在我的上两篇博文里,一篇是安装,一篇是配置远程登录, 提君博客原创 >>提君博客原创 http://www.cnblogs.com/tijun/ << 所以我的mysql的 ...
- Kafka-Flume-elasticsearch
a1.sources = kafkaSource a1.channels = memoryChannel a1.sinks = elasticsearch a1.sources.kafkaSource ...
- MSDN学习: 加密解密Config文件中的Sections( Encrypting and Decrypting Configuration Sections)
https://msdn.microsoft.com/en-us/library/wfc2t3az(v=vs.100).aspx https://msdn.microsoft.com/en-us/li ...
- Vue簡介
vue使用由下向上的增量開發模型: vue是javascript的漸進框架: vue的目標是盡量使用簡單的API實現響應的數據綁定和組合的視圖組件.
- Reversing-x64Elf-100
一道很简单的小题 作为python小白这道题主要是学习了一点python知识...... 可以看出来 sub_4006FD 这个函数是用来判断输入密码是否正确的 我们看一下它的伪代码: signed ...