LibreOJ 6277. 数列分块入门 1
题目链接:https://loj.ac/problem/6277
参考博客:https://www.cnblogs.com/stxy-ferryman/p/8547731.html
两个操作,区间增加和单点查询。
思路:将整个数组按照block(block=sqrt(n))分成许多小块,lump[i]表示点i所在的块,tag[i]表示编号为i的块的增加值,如果是进行区间增加操作,我们一般可以把区间[l,r]分成三个部分,左边不完整的区间(只含有某块中的部分点),中间完整的区间(含有一些块的所有点),右边不完整的区间。这样对于左右的不完整区间,他们的点的数量是比较少的,我们可以进行暴力更新,对于中间的完整区间,一般来说他们的点比较多,我们就用标记数组tag[i]来记录第i块里增加的数,从而避免对太多的点进行单点更新。在单点查询时,某个点的值就是本身数组的值加上这个点所在的块的标记数组值(a[r]+tag[lump[r])。
点i所在的块是lump[i]=(i-1)/block+1,表示lump[i]=i/block+1。
假设现在n=9,那么block=sqrt(9)=3。
对1到9之间的点分块,在i=3时,错误:3/3+1=2,3就在第二组 ,但是这是不对的,按理说3应该在第一组,怎么办,把3减1....
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<set>
#include<cstdio>
#include<string>
#include<deque>
using namespace std;
typedef long long LL;
#define eps 1e-8
#define INF 0x3f3f3f3f
#define maxn 50005
/*struct point{
int u,w;
};
bool operator <(const point &s1,const point &s2)
{
if(s1.w!=s2.w)
return s1.w>s2.w;
else
return s1.u>s2.u;
}*/
int tag[maxn],a[maxn],lump[maxn];
int n,m,k,t,block;
void add(int l,int r,int c)//这里注意要把各个块的边界写正确
{
for(int i=l;i<=min(lump[l]*block,r);i++)//左边的不完整的块 暴力更新每个点
a[i]+=c;
if(lump[l]!=lump[r])//左边界和右边界不在一个块里面
{
for(int i=(lump[r]-)*block+;i<=r;i++)//右边的不完整的块 暴力更新
a[i]+=c;
}
for(int i=lump[l]+;i<=lump[r]-;i++)//中间的完整的块的标记数组 增加值
tag[i]+=c;
}
int main()
{
scanf("%d",&n);
block=sqrt(n);
fill(tag,tag+maxn-,);
for(int i=;i<=n;i++)//给每个点分块
lump[i]=(i-)/block+;
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
int op,l,r,c;
for(int i=;i<=n;i++)
{
scanf("%d%d%d%d",&op,&l,&r,&c);
if(op==)
add(l,r,c);
else
printf("%d\n",a[r]+tag[lump[r]]);
}
return ;
}
LibreOJ 6277. 数列分块入门 1的更多相关文章
- LibreOJ 6277. 数列分块入门 1 题解
题目链接:https://loj.ac/problem/6277 题目描述 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,单点查值. 输入格式 第一行输入一个数字 \( ...
- LibreOJ 6277 数列分块入门 1(分块)
题解:感谢hzwer学长和loj让本蒟蒻能够找到如此合适的入门题做. 这是一道非常标准的分块模板题,本来用打标记的线段树不知道要写多少行,但是分块只有这么几行,极其高妙. 代码如下: #include ...
- LibreOJ 6277. 数列分块入门 2
题目链接:https://loj.ac/problem/6278 参考博客:https://blog.csdn.net/qq_36038511/article/details/79725027 这题我 ...
- LOJ #6277. 数列分块入门 1-分块(区间加法、单点查询)
#6277. 数列分块入门 1 内存限制:256 MiB时间限制:100 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ——#6277. 数列分块入门 1
~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法——分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...
- LibreOJ 6278. 数列分块入门 2 题解
题目链接:https://loj.ac/problem/6278 题目描述 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,询问区间内小于某个值 \(x\) 的元素个数. ...
- LOJ#6277. 数列分块入门 1
分块思想,先把原来的序列分成根号n快,然后对于更新的部分,先操作这个序列边上的部分,然后再中间部分整块操作,这样复杂度就是O(根号N) #include<map> #include< ...
- LibreOJ 6285. 数列分块入门 9
题目链接:https://loj.ac/problem/6285 其实一看到是离线,我就想用莫队算法来做,对所有询问进行分块,但是左右边界移动的时候,不会同时更新数字最多的数,只是后面线性的扫了一遍, ...
- LibreOJ 6282. 数列分块入门 6
题目链接:https://loj.ac/problem/6282 参考博客:http://www.cnblogs.com/stxy-ferryman/p/8560551.html 这里如果用数组的话元 ...
随机推荐
- 国内好的python学习地址
python3官方在线文档https://docs.python.org/3/ 玩蛇网http://www.iplaypy.com/ python中文网 http://bbs.pythontab.co ...
- HTML5 图片宽高自适应,居中裁剪不失真
一,使用 JS,先上效果图,右图为定死宽高的效果,左图为处理之后的 1, 主要思路是,在图片 onload 后,将图片的宽高比和 div 容器的宽高比进行比较, 2, 从而确定拉伸或者压缩之后是宽还是 ...
- MySQL5.7 查询用户,配置IP限制
1) MySQL 查询现在所有用户 select host,user from user; Navicat点击用户标签 查询;2) GRANT ALL PRIVILEGES ON *.* TO 'em ...
- 使用ssh密钥登录虚拟主机里的另一台主机报警的解决方案
提示:Address 192.168.*.* maps to localhost, but this does not map back to the address - POSSIBLE BREAK ...
- treeMap 基于JDK 1.8的学习
困惑了很久的红黑树========来个了断吧 本文主要是为了描述旋转的原则,所以,至于红黑树的数据结构,红黑树的基本准则,不在强调,,红黑树困惑的就是这旋转的过程.!!! 画红黑树很简单的画图工具: ...
- babel 基本
babel的大概知识点 . babel常用的转译器是babel-preset-env. 常用的配置选项是plugins和presets 常用的使用场景是在webpack中 https://www.cn ...
- BerOS File Suggestion(stl-map应用)
Polycarp is working on a new operating system called BerOS. He asks you to help with implementation ...
- 在Linux中简单实现回收子进程
学习到wait函数了,这个函数的作用是用来回收进程.一般来说,正常退出的进程是不需要我们来专门回收的.但是进程有这两种:孤儿进程和僵尸进程. 孤儿进程: 通俗点说就是父进程先于子进程死亡.此时子进程就 ...
- Oracle问题小结
1.win8.1安装Oracle11g后,重启电脑,出现黑屏. 解决办法:安全模式下,找到以oracle开头的全部服务,所有“自动”或者“自动(延迟启动)”的都设置为“手动”,只需要开启OracleO ...
- 配置nginx实现windows/iis应用负载均衡(转载)
配置nginx实现windows/iis应用负载均衡 nginx是俄罗斯人开发的一款跨平台的高性能HTTP和反向代理服务器,可以利用它实现web应用服务器的负载均衡. 反向代理是指将用户请求通过代 ...