题目的打开方式是酱紫的

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

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. 利用IDL将一个txt文档拆分为多个

    测试.txt文档,每47行的格式相同,通过代码每47行存为一个txt,txt文档命名为其第一行数据. 代码如下: file='G:\data\测试.txt' openr,lun,file,/Get_L ...

  2. Opencv配置问题_Error LNK2019

    终于配好opencv(Win7 64位+VS2013+opencv2.4.9),兴奋的写了第一个程序(当然是显示lena的玉照了): #include <opencv2\opencv.hpp&g ...

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

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

  4. my sql中join的操作

    SQL标准中的Join的类型:  首先,设置表employees和department的数据为:  1.inner join … on操作类型 内连接inner join是基于连接谓词将两张表(如A和 ...

  5. vs2013单元测试练习过程

    1.打开VS2013 --> 新建一个项目.这里我们默认创建一个控制台项目.取名为UnitTestDemo 2.在解决方案里面新增一个单元测试项目.取名为UnitTestDemoTest 创建完 ...

  6. jsp中两种include的区别【转】

    引用文章:http://www.ibm.com/developerworks/cn/java/j-jsp04293/ http://www.cnblogs.com/lazycoding/archive ...

  7. android常用调试工具fiddle、wireshark和android studio的配置

    Fiddle配置android代理 在wifi的同一个局域网环境的windows主机中安装fiddler,并且启动,如本次192.168.3.14 在android手机端配置代理为该主机 还有一种方式 ...

  8. SQL Server 数据库的维护(二)__触发器

    --维护数据库-- --触发器-- --概述: 触发器是一种特殊类型的存储过程,用来强制执行业务规则.在调用执上,触发器不能像存储过程那样可以由用户通过T-SQL语句直接调用,而是需要有数据库所发生的 ...

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

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

  10. 使用ZooKeeper实现软负载均衡(原理)

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,提供的功能包括配置维护.名字服务.分布式同步.组服务等. ZooKeeper会维护一个树形的数据结构,类似于Windows资源管理器 ...