2019暑训 Day5 组队赛

7月5号组队赛

VJ链接
A
听说是一个最长上升子序列的板子,dp一套就过去了。

B
coolwx用三进制的暴搜办法过了,我认为这种思想相当值得学习。周末打算也重写一遍这个办法。

D
感觉就是个贪心…搞了半天还是wa在了40几的test的上面…大体思路就是:可以证明,只要满足以任意没有装cam的用户为起点、长度为r的区间都包含了至少2个cam,那么对于每一个以装了cam的用户为起点、长度为r的区间也至少包含2个cam。这里没有装cam的用户的选取不能超过n - r + 1,因为这已经到了最后一段长为r的区间的起点。
根据这个思想,我们从前往后遍历,一直遍历到n - r + 1。如果当前用户装了cam,不予考虑,继续前进;如果没有装cam,搜索以他为起点的r区间内包含了多少cam,如果cam个数>= 2,符合要求,继续前进,如果等于1, 将另一个cam尽可能的往后走(具体实现的时候要对终点是不是这个唯一的cam拥有者进行分类),如果等于0,毫无疑问我们贪心地把这2个cam放到最后两个用户家里。上述的每一次遍历都将添加的个数更新到ans里。最后特判了一下最后一个r段的cam情况,补全直到2,将添加个数记录到ans里。

这么看起来应该是没有问题了,但我在写报告的时候意识到了wa了的原因:在向前搜索时不予考虑cam拥有者的做法的理论基础可能表述的不够清晰。更精确的说,我们只有在保证对于某个cam拥有者后面r - 1的距离上所有不拥有cam的用户都满足我们的前提,这样的cam拥有者才可以确定不用考虑(这也就是我们的证明手法)。可是,在我们的搜索过程中,我们只保证了1到n - r + 1上的不拥有cam的用户符合这样的前提,那么可以直接跳过的cam拥有者的范围应该只有[1, n - 2 * r + 1] ! 对于区间的后面的cam拥有者应该再考虑一次!

E
优先队列的基本应用。
注意累加上去后求的是Sn的Sn,要开long long

G
基本的模拟题。
注意地面也要算一个障碍物。
dev是什么垃圾编译器??我用xcode改了一行的bug交了就AC,dev调bug调了一年最后发现最应该调的应该是dev的bug…

H
dfs贪心算法,遇到云朵直接往下搜,可以保证不会使Island的数量变多。

I
Day3 snowman的变体?当时snowman没有过,所以没敢往下做,过一阵子考察一下它的数据范围再思考一下。

J
感觉是个优先队列的应用,开两个优先队列,一个在负轴一个在正轴,越远优先级越高,优先送完最远距离的邮件。大概写了写后发现第二组样例…mail的数量好大啊…用队列一个个吐出来怕是要T飞起来…就放了做别的去了。

K
把平局的情况忽略掉,总数应该是a和b各自胜过对方的情况数。

L
因为一个矩形划分一次一定还是两个矩形,所以我们选取一个矩形,把它作为square的一半,定义函数check检查传入的两个矩形能不能合成一个给定长宽的矩形,用check函数检查三遍就可以了。至于check函数的实现,只要对于两个矩形两个边长的每一种组合都搜索一下,检查四遍就是了。

M
emmm感觉是个水题,写下来代码不过20行,但wa了好多好多次…最开始我没有意识到这道题就是把所有的点连起来,直观的从图形看就是找峰/谷,也就是极值点…这样子考虑后用了一个数列的极值点判别式找所有的峰和谷,除了n == 1的时候输入1别的都输出cnt + 2…结果wa到倒立洗头…
后来想到了有可能极值点不是真正数学意义上的极值点,比如1 5 5 2,最高点5应该是一个我们要找的“极值点”,但是判别算法不认为这是一个极值点,这就导致了wa。因而我们应该对该序列去重后再搜索,注意该去重是对重复元素的去重,所以我么使用unique函数就可以了。
想到了去重,又把n == 1的判断也放在了去重的后面。比如说1 1 1 1 1, 在之前的算法中就会乱入到n不等于1的流程中,从而输出的结果ans + 2 >= 2肯定是wa的。这样子啰啰嗦嗦考虑了好多事情后,总算绿了,太不容易了。
由此要注意,题目要求的点是不是 真正 的与我们的算法得到的点完全等价是我们需要着重考虑的问题。比如说,序列的不增(≤)与不减(≥)其本质就是等号与不等和的结合问题。

你可能感兴趣的:(ACM)