2018/3/13

Posted Nawox

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018/3/13相关的知识,希望对你有一定的参考价值。

  没有题解的考试

  标程1k我却只能改5k+的改法

T1 simple

  我好像遇到最长上升子序列的题就做不出来,上回在成都就是一道非常显然的上升子序列的部分分,然而我就是没有看出来,这次又是,开始一个小时,根本没有什么正经的思路,一直在搞什么逆序对,发现了一堆奇奇怪怪的性质,但是没什么卵用,直到我把别的题的暴力都敲完了,回来一看,才猛然发现链的情况是最长上升子序列,并且可以拓展到树上进行DP,然后搞到了40分,然后链的情况我还觉得可能是根有两个儿子,就算是这样,也是这敲一下啊,反正又不难打,然后40分的暴力,因为最后离散后没有把权值的最大值给改过来,又丢掉了20分。。。。。 感觉这是考试以来,做得最不爽的一道题

  但是我们的大猩猩现场就A了,他的做法就是把DP的过程优化成在线段树上搞,可以发现,在原来的f数组中,有实际贡献,也就是实际存在的j就是这可子树里存在过的权值,那么我们可以直接对于每一个节点开一个权值线段树,对应的权值就是原来f数组中的值,但是合并儿子的时候,并不能让对应节点简单的相加,因为两个儿子中,不同的j也会有产生更优的贡献,比如说,1号儿子有一个4的小根堆,那么他完全可以直接的加到2号儿子的3的小根堆中,所以我们考虑一个点,会对另一个子树中的哪些点产生贡献,首先,如果j<k并且f[i][j]<f[i][k],那么k就会比j更优,所以j对另一颗子树里的贡献会被j所覆盖,所以在线段树里维护一下然f是单调递减就好了,然后在合并的时候采用启发式合并,把小的线段树直接拍成一个数组,然后就先查一下每一个点在大线段树中的后继,因为这个别的子树中对他的最优贡献(单调性)那么记录一下这个值,这个是这个点被别的子树更新过的结果,然后在对大线段树中他能贡献的点区间加一发,就完成了儿子之间的合并,因为每一个儿子的线段树都是单调的,所以儿子合并之后依然是单调的,然后考虑加入当前的根的贡献,就是从所有儿子合成的大线段树中,查他的后继,然后+1就是这个根的最优贡献,但是由于这个根的+1操作,在把他插入到线段树中的时候,就可能造成线段树的不单调,就不断的查他的前驱,比他小就删掉,这样因为每一个点最多会被删掉一次,所以复杂度也是有保证的,然后这么搞下去就好了。。。。

  然后线段树里查前驱后继的话,如果要查x的后继,就先走到x所在的位置,然后在递归回来的时候,判断右儿子是不是空,回来第一个不是空的右儿子就是后继。

  正解的话就更NB了一些,我们想,如果两棵线段树里存的值不进行区间加,查后继更新这种操作的话,那么一个点的f值实际上就是他所在线段树的后缀和,那我们直接用一个 map 来实现存储每一个点自己不更新的值,然后启发式合并一发,最后遍历一下 map 第一个点的后缀和就是答案了,那么我们考虑一下map中每一个点的值的新含义,实际上就是它所代表的小根堆比他后继所代表的小根堆中的点数多了多少,但是还有一个没有解决的问题就是当把根这个点插入的时候,如何维护单调性,其实跟这个点的值直接++就好了,因为它比他后面的堆中多了一个点,但是这个根所在的点不能对它前面的点做出贡献因为他是堆顶,但是由于我们维护的是一个后缀和,每一个点实际上就是上一个办法中的线段树中的每一个点与相邻点的差分值,所以需要把他的前驱的值-- 来抵消掉它造成的影响,当他的前驱-- 之后变成了0那么就意味着,这个点的前驱所代表的小根堆中的点和这个点的小根堆的点数是一样的,那么前驱就不优了删掉就好了。

T2 trans

  这个题的话,模拟一下就是把每一个区间长度从小到大取max之后形成的新序列,有一个30分的部分分就是先考虑较小的那个数所存在的总区间长度,然后算出他的贡献然后在用大的算整个区间的在减去小,在考虑一下首尾的特殊情况的就好了。。。。 正解也是类似的,就是把所有的点排序之后,从小到大,分为黑白两种点,已插入的是白点,未插入的是黑点,然后在计算贡献的时候,就是这一步所有区间的贡献减去上一回的贡献,这么搞下去,然后也是注意一下不叫恶心的首尾情况。。 区间合并的话可以用链表,也可以用set

T3 mov

  50分的暴力还是很好拿的,正解就是小魔术就用卢卡斯,就是把每一个先有步转换,把(x,y)变成((x+y)/2,(x-y)/2),这样的话原来的移动对应到现在就是(x+1,y),(x,y+1),(x+1,y+1),然后设斜着走i步,A=(n+m)/2,B=(n-m)/2,那么方案数就是C(A+B-i,A)*C(A,i),然后我们就把C上的四个数都变成P进制,然后数位DP,转移求乘积就好了,但是值得注意的就是,如果(A+B)%p-i小于零了,那么我们就是要从更高的位上借一位,然后DP的f数组多开一位记录一下借位的情况就行了

 

  总结一下就是T1的懵逼导致后面的题做起来有些心理阻碍,做起来就没有那种顺畅的感觉,然后T1看出来是lis之后,打完想到了T2暴力之后也没有什么时间敲了,感觉最后一个小时直接就浪费掉了,T1的影响还是太大了,而且lis也并不难想么,逆序对想不出来完全可以换一种思路么。。。。。。。。。。。。

  T1还是挺令人印象深刻的。。。。。。。。。。。。

以上是关于2018/3/13的主要内容,如果未能解决你的问题,请参考以下文章

读书笔记 2018-3-13

2018/3/13

kindle笔记之 《解忧杂货店》-2018-3-13

机器学习面试问题集(2018-3-13更新)

2018-3-13 12周2次课 Nginx安装默认虚拟主机用户认证域名重定向

TensorFlow学习(十三):构造LSTM超长简明教程