好久没有做过比赛了耶。。状态不是太好。
一开始看题,看了一下题居然被XC抓去讲题了。。囧。。
第一眼看第一题时以为是道可修改的主席树的裸题,然后继续看第二题。发现没有什么感觉,去看第三题,发现之前做过,但是都忘得差不多了。
然后发现对偶了之后再差分就是比较裸的费用流了。
于是先回去看第一题,发现自己好像读错题了。。。YY了一下,觉得整体二分比较科学,马上就开打了。9点钟左右打完,样例过了,然后对拍,发现居然错掉了。。检查了一下程序,发现没有考虑操作的时间的影响。但是这个问题比较好解决。继续拍,又发现题目问的是第K大。。我的程序打的是第K小。。
然后搞了一下才拍过了。此时已经9点半。。一道水题卡了半个钟。。
因为第二题没有什么思路,于是就去看第三题。但我都差不多忘了怎么转费用流了。。糟糕。。。把图推出来花了好久,一直没有想到一个比较好的解决方法。最后发现再加一条空限制就完美解决了。。然而已经11点。。测了一下大数据,发现卡的不行。。2s根本跑不出来啊。。于是就开始卡常。把spfa换成了dij,然后居然还要手打堆。。不开O2简直坑啊。。就这样一直优化到了11点半,感觉差不多了。随机数据还是能碾过去的。。还是20分钟。。
我第二题还没有做啊~!!!!
赶紧去看了第二题,感觉不可能会做啊。。。什么神题。。。再看部分分,30分简直是送的。。几分钟敲完后就弃疗了。。
最后是100+30+90.、。。最后一题还是被卡了一个点。。
暴露的问题:
1. 比赛时候有点心急,没有按以前的那种得到算法后尽量找自己算法漏洞的方法来做。导致第一题卡了很久。
2. 第二题太早的宣布放弃。其实假如画个图出来的话可能就发现这题其实不难。
3. 有些知识太久没用忘掉了。重新推出来时会花一定的时间。
写个第二题的题解吧。看起来挺不错的这题。
ZJOI2013 蚂蚁寻路
题目大意
在一个n*m 的棋盘上,每个格子有一个权值,初始时,在某个格子的顶点处一只面朝北的蚂蚁,我们只知道它的行走路线是如何转弯,却不知道每次转弯前走了多长。蚂蚁转弯是有一定特点的,即它的转弯序列一定是如下的形式:
右转,右转,左转,左转,右转,右转…左转,左转,右转,右转,右转。
即两次右转和两次左转交替出现的形式,最后两次右转(最后两次一定是右转)后再多加一次右转。我们还知道,蚂蚁不会在同一个位置连续旋转两次,并且蚂蚁行走的路径除了起点以外,不会到达同一个点多次,它最后一定是回到起点然后结束自己的行程,而且蚂蚁只会在棋盘格子的顶点处转弯。
现在已知棋盘大小、每个格子的权值以及左转次数/2 的值,问蚂蚁走出的路径围出的封闭图形,权值之和最大可能是多少
题解
其实你手画一下你就会发现,这只蚂蚁的路线肯定是这样子的
也就是说从起点开始,有若干个矩形组成。并且矩形的下端是平齐的。
并且矩形的高度也是一高一低这样子排列的。
总共会有 K∗2+1 个矩阵,K是读入进来的左转次数/2的值。
那么我们现在就直接把K变成K*2+1.
考虑Dp来解决对于这种形状的最大值问题。
设
Fi,j,p,h
表示以
(i,j)
为图形的右下角的点的坐标,
p
表示当前是第
那么 Fi,j,p,h 的转移其实是非常简单的。
Fi,j,p,h=max(Fi,j−1,p,h,Fi,j−1,p−1,h′)+Sum(i,h)→(i,j)
对于 max 中的第一项是很好理解的,这表示我们的当前的矩形还在延续。
对于
max
的第二项,这表示我们枚举上一个矩形的上端坐标。
首先
h′
是有取值范围的。
若
p
为奇数,表示当前的矩形是高的,那么上一个矩形就要是矮的。那么
否则
p
为偶数,表示矩形是矮的,那么上一个矩形就要
并且 h′<=i
那么我们可以发现 max 的第二项其实可以不需要枚举 h′ ,我们只需要维护出一个前缀最大值和一个后缀最大值就好了。
那么计算
F
的复杂度就可以变为
但是空间可能会比较吃紧,但我们注意到 Fi,j,p,h 的转移与 i−1 无关,那么我们就不用存第一维了。空间是 O(NMK) 。没有问题。