题目的打开方式是酱紫的

然而作为一只蒻蒟根本不会线段树该怎么办呢?

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 | | 线段树の暴力的更多相关文章

  1. Luogu P4198 楼房重建 分块 or 线段树

    思路:分块 提交:2次(第一次的求解有问题) 题解: 设块长为$T$,我们开$N/T$个单调栈,维护每一块的上升斜率. 修改时暴力重构整个块,$O(T)$ 求解时记录一个最大斜率$lst$,然后块内二 ...

  2. hdu 4288 线段树 暴力 **

    题意: 维护一个有序数列{An},有三种操作: 1.添加一个元素. 2.删除一个元素. 3.求数列中下标%5 = 3的值的和. 解题思路: 看的各种题解,今天终于弄懂了. 由于线段树中不支持添加.删除 ...

  3. 【BZOJ】3038: 上帝造题的七分钟2(线段树+暴力)

    http://www.lydsy.com:808/JudgeOnline/problem.php?id=3038 这题我就有得吐槽了,先是线段树更新写错,然后不知哪没pushup导致te,精度问题sq ...

  4. bzoj3276磁力 两种要求下的最大值:分块or线段树+拓扑

    进阶指南上的做法是分块的.. 但是线段树搞起来也挺快,将磁石按照距离排序,建立线段树,结点维护区间质量最小值的下标 进行拓扑,每次在可行的范围内在线段树中找到质量最小的下标取出,取出后再将线段树对应的 ...

  5. hdu 6430 线段树 暴力维护

    Problem E. TeaTree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  6. 【Vjudge】P558E A Simple Task(线段树暴力)

    题目链接 这题……太暴力了吧…… 开二十六棵线段树维护l到r字符i出现的次数,然后修改的时候暴力修改,输出的时候暴力输出……就过了…… 然后我还没想到…… qwq #include<cstdio ...

  7. HDU 5700 区间交 线段树暴力

    枚举左端点,然后在线段树内,更新所有左边界小于当前点的区间的右端点,然后查线段树二分查第k大就好 #include <cstdio> #include <cstring> #i ...

  8. CodeForces 228D. Zigzag(线段树暴力)

    D. Zigzag time limit per test 3 seconds memory limit per test 256 megabytes input standard input out ...

  9. CodeForces 438D The Child and Sequence (线段树 暴力)

    传送门 题目大意: 给你一个序列,要求在序列上维护三个操作: 1)区间求和 2)区间取模 3)单点修改 这里的操作二很讨厌,取模必须模到叶子节点上,否则跑出来肯定是错的.没有操作二就是线段树水题了. ...

随机推荐

  1. 初识makefile

    Makefile的规则 目标 : 需要的条件 (注意冒号两边有空格) 命令 (注意前面用tab键开头) 解释一下: 1 目标可以是一个或多个,可以是Object File,也可以是执行文件,甚至可以是 ...

  2. JS面向对象的程序设计

    面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...

  3. archlinux配置答疑

    Q: chinese can not appear in my firefox and terminal rightly A: pacman -S wqy-microhei Q: install pi ...

  4. flag--命令行参数定义多标签示例

    // TestFlag2 project main.go package main import ( "flag" "fmt" ) func main() { ...

  5. 关于ddpush推动实现抖动视频的使用

    /**   //开机之后打开服务  开机成功打开服务ddpushService**/ <!-- 开机广播 --> <receiver android:name="com.r ...

  6. Set,List,Map,Vector,ArrayList的区别(转)

    JAVA的容器---List,Map,Set Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtab ...

  7. 关于.net Microsoft.Office.Interop.Word组建操作word的问题,如何控制word表格单元格内部段落的样式。

    控制word表格单元格内部文字样式.我要将数据导出到word当中,对于word表格一个单元格中的一段文字,要设置不同的样式,比如第一行文字作为标题要居中,加粗,第二行为正常的正文. 代码如下 publ ...

  8. Parquet与ORC:高性能列式存储格式(收藏)

    背景 随着大数据时代的到来,越来越多的数据流向了Hadoop生态圈,同时对于能够快速的从TB甚至PB级别的数据中获取有价值的数据对于一个产品和公司来说更加重要,在Hadoop生态圈的快速发展过程中,涌 ...

  9. 我读汤姆大叔的深入理解js(一)

    前言 闲来看看javascript,在圆子里发现了汤姆大叔的文章,先是整体瞄了几眼,感觉不错,然后细细研读.记录下自己的学习历程和个人理解.更重要的是作为笔记 高质量JS代码 在看汤姆大叔的这一系列文 ...

  10. sqlite数据库安装配置

    一.SQLite简介    SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中, ...