魔性の分块 | | jzoj1243 | | 线段树の暴力

题目的打开方式是酱紫的
然而作为一只蒻蒟根本不会线段树该怎么办呢?
sro MZX orz 是这样说的:用分块啊!
分块
根据紫萱学姐的教程,分块的打开姿势是这样的:
我们要对一个数组进行整体操作,那么我们就可以把他们分成元素相等的n部分,由于n部分的最大值很容易找,也就是我们可以预处理出最大值(更何况此题最开始数组赋初值为0)我们要查询第k1-k2个数的最大值,就返回k1-k2所对应的块的最大值即可,
好,作为一只蒻蒟根本不知所云?
用一张图解来表示一下就是酱紫

红线代表整个数组,底下数轴就代表每一块的大小,绿线表示查询的区间,蓝线和橙线代表块里的其他元素;
那么左端点块内剩余的元素该怎么找呢?
这时候我们可以模拟出来一个小块,这个小块代表剩余元素的最大值,然后再和其他元素块的最大值就可以了,同理右端点也是如此;
那么代码实现呢?
代码
莫名其妙刚开始只能过小数据,我也不知道为什么,后来经过神犇lyy的点拨,我才知道是什么意思
(一)插入
v-1.0的代码如下
int tempx=x/S;
int left=tempx*S,right=min(left+S,n);
a[x]=y;
for(int i=left;i<right;i++)
if(a[i]>block[tempx])
block[tempx]=a[i];
v2.0的代码如下
int tempx=x/S;
int left=tempx*S,right=min(left+S,n);//注意right的取值
a[x]=y;
block[tempx]=-1*INF;
for(int i=left;i<right;i++)
if(a[i]>block[tempx])
block[tempx]=a[i];
没错只有一步tempx的初值还要变化成最小值,并且要注意right中left+S不能超过n的取值范围
(二) 查询
int work(int x,int y)
{
int l=x/S,r=y/S,ans=-INF;//定位块
if(l==r)
{//如果在一块内
for(int i=x;i<=y;i++)
if(a[i]>ans)
ans=a[i];
return ans;
}
for(int i=x,ed=(l+1)*S;i<ed;i++)
if(a[i]>ans)
ans=a[i];
for(int i=l+1;i<r;i++)
if(block[i]>ans)//整体操作
ans=block[i];
for(int i=r*S;i<=y;i++)
if(a[i]>ans)
ans=a[i];
return ans;
}
魔性の分块 | | jzoj1243 | | 线段树の暴力的更多相关文章
- Luogu P4198 楼房重建 分块 or 线段树
思路:分块 提交:2次(第一次的求解有问题) 题解: 设块长为$T$,我们开$N/T$个单调栈,维护每一块的上升斜率. 修改时暴力重构整个块,$O(T)$ 求解时记录一个最大斜率$lst$,然后块内二 ...
- hdu 4288 线段树 暴力 **
题意: 维护一个有序数列{An},有三种操作: 1.添加一个元素. 2.删除一个元素. 3.求数列中下标%5 = 3的值的和. 解题思路: 看的各种题解,今天终于弄懂了. 由于线段树中不支持添加.删除 ...
- 【BZOJ】3038: 上帝造题的七分钟2(线段树+暴力)
http://www.lydsy.com:808/JudgeOnline/problem.php?id=3038 这题我就有得吐槽了,先是线段树更新写错,然后不知哪没pushup导致te,精度问题sq ...
- bzoj3276磁力 两种要求下的最大值:分块or线段树+拓扑
进阶指南上的做法是分块的.. 但是线段树搞起来也挺快,将磁石按照距离排序,建立线段树,结点维护区间质量最小值的下标 进行拓扑,每次在可行的范围内在线段树中找到质量最小的下标取出,取出后再将线段树对应的 ...
- hdu 6430 线段树 暴力维护
Problem E. TeaTree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- 【Vjudge】P558E A Simple Task(线段树暴力)
题目链接 这题……太暴力了吧…… 开二十六棵线段树维护l到r字符i出现的次数,然后修改的时候暴力修改,输出的时候暴力输出……就过了…… 然后我还没想到…… qwq #include<cstdio ...
- HDU 5700 区间交 线段树暴力
枚举左端点,然后在线段树内,更新所有左边界小于当前点的区间的右端点,然后查线段树二分查第k大就好 #include <cstdio> #include <cstring> #i ...
- CodeForces 228D. Zigzag(线段树暴力)
D. Zigzag time limit per test 3 seconds memory limit per test 256 megabytes input standard input out ...
- CodeForces 438D The Child and Sequence (线段树 暴力)
传送门 题目大意: 给你一个序列,要求在序列上维护三个操作: 1)区间求和 2)区间取模 3)单点修改 这里的操作二很讨厌,取模必须模到叶子节点上,否则跑出来肯定是错的.没有操作二就是线段树水题了. ...
随机推荐
- OC编程的一些UI细节
1/如果你想用一个半透明的View遮住当前窗口,连并NavigationBar也一并遮住的话,那么你需要 将视图添加到navigationController的View上 [self.navigati ...
- 你是否经常忘记网站上的各种密码?分享个密码管理软件LastPass
现在网络那么发达,我们上网的每个人势必会在各个网站上登陆,那势必会有一堆密码需要管理,那怎么能记住那么多网站的密码呢?我之前的做法是设置几个常用的密码,好多不重要的网站用一个,重要的网站用一个,然 ...
- python中的浅拷贝和深拷贝
1.赋值语句 a = 'abc' b = a print id(a) print id(b) # id(a):29283464 # id(b):29283464 通过简单的复制,我们可以看到,a b其 ...
- Orcle基本语句(三)
COMMIT; --查询表内所有内容 SELECT * FROM stu_info; --查询部分列,并赋予别名 SELECT stu_id 学生标号,stu_name 学生姓名 FROM stu_i ...
- python已字典为元素的数组排序
dict = [ {','name':'b'}, {','name':'c'}, {','name':'a'}, {','name':'g'}, {','name':'f'} ] dict.sort( ...
- VMware 虚拟机桥接网络设置
一.桥接的基本原理 配置成桥接网络连接模式的虚拟机就当作主机所在以太网的一部分,虚拟系统和宿主机器的关系,就像连接在同一个Hub上的两台电脑,可以像主机一样可以访问以太网中的所有共享资源和网络连 ...
- ubuntu14.04下安装cudnn5.1.3,opencv3.0,编译caffe及配置matlab和python接口过程记录
已有条件: ubuntu14.04+cuda7.5+anaconda2(即python2.7)+matlabR2014a 上述已经装好了,开始搭建caffe环境. 1. 装cudnn5.1.3,参照: ...
- delphi判断文件类型
function getFileType(inputFile:string):string;const JPEG_FLAG_BEGIN = $D8FF; JPEG_FLAG_END = $D9FF; ...
- Windows下用Python 3.4+自带的venv模块创建虚拟环境
Python 3.4+自带了venv模块,用于创建虚拟环境,每个虚拟环境都可以安装一套独立的第三方模块. 本文在Windows 10上操作. 1.创建一个虚拟环境: D:\>mkdir test ...
- git工作中的常用操作
上班开始,打开电脑,git pull:拉取git上最新的代码: 编辑代码,准备提交时,git stash:将自己编辑的代码暂存起来,防止git pull时与库中的代码起冲突,否则自己的代码就白敲了: ...