【线段树】几次比赛里面用到的线段树+

HDU - 6447  先占坑,晚上补]

------------18/9/28兑现诺言来补了.....---------

虽然吧现在写题不是主要任务了...   就别一天有了时间就写了吧.... 

时间利用效率很低.... 可以算作修炼的一部分,修炼入门之后完全可以搞搞其他的,代码的功力别断了就是极好的.

链接: 点击这里

[0x01].有关题目hdu6447

其实仔细去看上面的链接讲得还是蛮清楚的.... 我就不重复了

主要就是: 其实一个点的最大值可以在上一行中横坐标小于当前横坐标的这些位置中的一个最大值加上当前点的值或者是本行左边的最大值取到。然后就用树状数组来维护这个最大值。最后的答案,只要在里面找到最大值就好了。

然后演示的图其实是先从左往右, 然后从上到下实现的... 至于为什么呢?

 

离散化: 参考1   (好懂)参考2(更准确一些)

关键:

  例如 5 5 3 2

  离散化应该是 3 3 2 1

  而不是  4 3 2 1

先排序,再去重(得到标签序号的个数,数组就扔在那里了)

最后,用lower_bound  找到这个东西应该插入到哪个地方(lb最后是下标咯... ) 再加1

//sub_a是原来数组,先排序,没错,unique一下
//a[i]好像也是原来的数组,总之最后的结果是放在a[i]里去的...  唔,差不多就是一个副本的关系吧.,

sort(sub_a,sub_a+n);
int size=unique(sub_a,sub_a+n)-sub_a;//size为离散化后元素个数
for(i=0;i<n;i++)	
a[i]=lower_bound(sub_a,sub_a+size,a[i])-sub_a + 1;

 

[0x02].

题解1 解释的其实不错,但是 图错了,还是严格按照从上到下,从右边往左边来,(这样就不会影响后面,不然就是会疯狂累加,累加,累加个不停...)(就像背包原理一样,用过的扔掉)

至于呢,我们想获取的是每次变化的列,列里面的最大值,树状数组直接维护(复习树状数组)

题解2 有声之年看到写的这么详细的真是涕泪俱下....

以下为转载0----------------------

题意:有一个1e9*1e9的地图,从0,0开始走,只能向右,向下,向右下三种行走方式。地图上有n个坐标有权值val,若能通过向右下行走的方式达到这些坐标,就能收获val的积分。问走到最后获得的最大积分是多少。

首先想到的是一个动态规划求最大收获。递推式即dp[i][j]=max(dp[0~i-1][0~j-1])+val[i][j]。
在该坐标的左上角区域内的任意一个位置取一个最大值继承。这就形成了一个找二维区间最大值的问题。但是仔细一想是否真的是二维的?

首先我们对于地图的遍历顺序是从上到下从左到右递推。那么当要计算第i行第j列的值时,因为遍历过了该行上方的每一行即0~i-1,并且没有对i以下行数据进行遍历和处理。因此行是一直都限定好是遍历不到后面的位置的。查询区间最大值时就不会超过i,那么很明显就是对j-1列进行一维区间最大值的查询,用线段树进行处理。

还有一个问题是若从左到右遍历一行,那么低位列先被更新一个最大值。这样会出现的问题是,之后的列在通过线段树查询区间最大值是会通过同行列的数据传递过来,这是不合理的。为了避免这种情况,我们从后往前遍历j,并更新线段树,就不会影响,因为更改的值在查询区间之外。

其次,对于线段树的更新,我们每次都用一个继承过来的值加上新村庄的值,再单点更新回线段树。这样是能保证线段树中每列的值是不断变大的。因为我们每次都是去区间内最大值加上某个值,再去更新某一列,覆盖掉的该列的值必定小于新值。

最后,因为地图是1e9*1e9的,村庄只有1e5个,因此要做一个离散化。这里用vetcor去重离散化的模板。首先记录下每个坐标,然后对坐标排序,我们需要的是坐标排序后的下标,这就是坐标之间的相对大小,然后对于主要存储坐标的数组进行值的离散化后的更新。
一个坐标x原值,映射到该x在排序后数组中的下标值。通过二分排序数组找到下标值,之间赋值给存储坐标数组的x,就是离散化后的坐标值。

--------------------- 本文来自 kuronekonano 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/kuronekonano/article/details/82119767?utm_source=copy

 

[0x03].有关修炼

心还是静不下来.. 下午在一个玩手机的妹子旁边坐着,看着她晾着电脑我就很烦... 

于是一气之下收拾好走了...换了地方之后直到我在爱好文具下了单才有心细细的看剩下的东西

晚上因为去菜鸟耽误了有1小时.. 回来马上划水半个小时换课,还不觉得羞耻......

很早以前就是这样的状态......  很难专注,又随时都容易被打断.

今天觉得,如果进入了状态快一点还好吧..

有别的环境因素就先别管它了... 找到自己觉得舒服的环境就好.... 还要继续修炼啊,今天感觉完全回到了之前的状态呢

还有就是  做事要果敢....要迅速....

每天中午看一下滴答需要我做什么.....

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值