30
Bugs Integrated, I Bugs Integrated, I nc. nc. 解解解解 解解解解 00001054 00001054 解解解 解解解

Bugs Integrated, Inc. 解题报告

Embed Size (px)

DESCRIPTION

Bugs Integrated, Inc. 解题报告. 00001054 胡华嵩. 一、算法设计. 用动态规划的思想 所有的 “ 方块 ” 的坐标值都减 1 ,则坐标满足 0≤x≤N-1 0≤y≤M-1 每个方块就用一个有序 2 元组表示 (x,y) x,y 满足上面两个式子. 定义 1. 设向量 B=(b 0 ,b 1 , … ,b M-1 ) , S(B) 表示一个由方块组成的集合。严格的定义如下: S(B)={(x,y)|x≤b y } - PowerPoint PPT Presentation

Citation preview

Page 1: Bugs Integrated, Inc.     解题报告

Bugs Integrated, Inc. Bugs Integrated, Inc. 解题报告解题报告0000105400001054

胡华嵩胡华嵩

Page 2: Bugs Integrated, Inc.     解题报告

一、算法设计一、算法设计 用动态规划的思想用动态规划的思想 所有的“方块”的坐标值都减所有的“方块”的坐标值都减 11 ,则坐标满,则坐标满足足 0≤x≤N-10≤x≤N-1 0≤y≤M-10≤y≤M-1 每个方块就用一个有序每个方块就用一个有序 22 元组表示元组表示 (x,y) (x,y)

x,yx,y 满足上面两个式子满足上面两个式子

Page 3: Bugs Integrated, Inc.     解题报告

定义定义 11 设向量设向量 B=(bB=(b00,b,b11,…,b,…,bM-1M-1)) ,, S(B)S(B) 表示一个由表示一个由方块组成的集合。严格的定义如下: 方块组成的集合。严格的定义如下:

S(B)={(x,y)|x≤bS(B)={(x,y)|x≤byy}} 如果把如果把 BB 看成是一个边界的话,看成是一个边界的话, S(B)S(B) 表示表示的就是边界的就是边界 BB 左边的所有部分,我们可以左边的所有部分,我们可以从下图看出:从下图看出:

Page 4: Bugs Integrated, Inc.     解题报告

B=(1,5,0,-7,3),N=9,M=5,B=(1,5,0,-7,3),N=9,M=5, 蓝色部分即为蓝色部分即为 S(B)S(B)

Page 5: Bugs Integrated, Inc.     解题报告

定义 定义 22 对于每个对于每个 (x,y)(x,y) ,我们定义一个以,我们定义一个以 (x,y)(x,y) 为边为边界的集合,记为界的集合,记为 B(x,y)B(x,y) 。严格的定义如下:。严格的定义如下:

S(B(x,y))=S(BS(B(x,y))=S(Bx,yx,y)) 其中其中 BBx,yx,y 为定义为定义 11 中的向量,且满足中的向量,且满足

bb00=b=b11=…=b=…=byy=x=xbby+1y+1=…=b=…=bM-1M-1=x-1=x-1

Page 6: Bugs Integrated, Inc.     解题报告

S(B(4,2))=S((4,4,4,3,3))S(B(4,2))=S((4,4,4,3,3))

Page 7: Bugs Integrated, Inc.     解题报告

定义定义 33 设设 P=(pP=(p00,p,p11,…,p,…,pM-1M-1)) ,其中,其中 0≤pi≤20≤pi≤2 。我们。我们规定 规定 S(B-P)=S((bS(B-P)=S((b00-p-p00,b,b11-p-p11,…,b,…,bM-1M-1-p-pM-1M-1)))) 相当于是在相当于是在 S(B)S(B) 的基础上,除去了每一行的基础上,除去了每一行最右边的最右边的 0(1,2)0(1,2) 个方块。个方块。 后面我们也用后面我们也用 S(B-P)S(B-P) 表示在表示在 S(B-P)S(B-P) 中能容中能容纳的纳的 3x23x2 矩形的最大数目。矩形的最大数目。

Page 8: Bugs Integrated, Inc.     解题报告

S(B(4,2)-P),S(B(4,2)-P), 其中其中 P=(0,2,1,0,2)P=(0,2,1,0,2)

Page 9: Bugs Integrated, Inc.     解题报告

• 把把 PP 的第的第 ii 个分量看成是个分量看成是 33 进进制数制数 的第 的第 ii 位,则每个位,则每个 MM 维向量维向量 PP与与 0 0 到到 33MM-1-1 中的一个数中的一个数 pp 一一对应。一一对应。 我们计算每个 我们计算每个 x,y,px,y,p 所对应的所对应的 S(B(x,y)-P)S(B(x,y)-P) 中所能包含的中所能包含的 3x23x2矩矩 形的最多数目。 形的最多数目。

Page 10: Bugs Integrated, Inc.     解题报告

为了下面讨论方便,还需要几点说明:为了下面讨论方便,还需要几点说明: EEjj 表示一个定义表示一个定义 33 中的向量,其中只有第中的向量,其中只有第 jj个分量的值为个分量的值为 11 ,剩下的全为,剩下的全为 00 。与。与 EEjj 相相对应的数为对应的数为 33jj 。。 ““00”” 表示的也是一个定义表示的也是一个定义 33 中的向量,其中的向量,其中所有的分量都为中所有的分量都为 00 。与。与 00相对应的数就是相对应的数就是00 。在下面的分析中。在下面的分析中 00和和 00 不加区分不加区分 (( 即都即都用“用“ 0”0” 表示表示 )) 。。 对于任意的一个对于任意的一个 pp ,, ppjj 表示与表示与 pp 对应的向对应的向量量 PP 的第的第 jj 个分量的值。个分量的值。 设设 pp 与与 PP 对应,对应, A(x,y,p)A(x,y,p) 的值为的值为 S(B(x,y)-S(B(x,y)-P)P) 中包含中包含 3x23x2 矩形的最多数目。矩形的最多数目。

Page 11: Bugs Integrated, Inc.     解题报告

给定给定 x,y,px,y,p 有两种情况: 有两种情况: ppjj>0 >0 和 和 ppjj=0=0 对于对于 ppjj>0>0 的情况,我的情况,我们以右边的两个图为们以右边的两个图为例:例: 容易看出:容易看出:

A(x,y,p)=S(B(x,y)-P)A(x,y,p)=S(B(x,y)-P)=S(B(x,y-1)-(P-E=S(B(x,y-1)-(P-Eyy))))=A(x,y-1,p-3=A(x,y-1,p-3yy))

Page 12: Bugs Integrated, Inc.     解题报告

对于对于 ppjj=0=0 ,又分三种情况:,又分三种情况: 1 1 以以 (x,y)(x,y) 为右下角不能放为右下角不能放 3x23x2 矩形矩形 2 2 以以 (x,y)(x,y) 为右下角能放一个横着的为右下角能放一个横着的 3x23x2 矩形矩形 3 3 以以 (x,y)(x,y) 为右下角能放一个竖着的为右下角能放一个竖着的 3x23x2 矩形矩形 当然,当然, 22 、、 33 两种情况都需要两种情况都需要 xx ,, yy 满足一满足一定的条件定的条件 对于第一种情况,对于第一种情况, (x,y)(x,y) 显然是多余的,加上显然是多余的,加上(x,y)(x,y) 与不加上与不加上 (x,y)(x,y) 是等价的,即是等价的,即A(x,y,p)=S(B(x,y)-P)A(x,y,p)=S(B(x,y)-P)=S(B(x,y-1)-P)=S(B(x,y-1)-P)=A(x,y-1,p)=A(x,y-1,p)

Page 13: Bugs Integrated, Inc.     解题报告

第二种情况第二种情况 很显然,要使第二种很显然,要使第二种情况成立,情况成立, pp 的值需的值需要一定的条件,即要一定的条件,即ppy-1y-1=0=0 从右图可以得到下面从右图可以得到下面的结论:的结论:A(x,y,p)=S(B(x,y)-P)A(x,y,p)=S(B(x,y)-P)=S(B(x,y-2)-(P+2x E=S(B(x,y-2)-(P+2x Ey-1y-1+2xE+2xEyy))+1))+1=A(x,y-2,p+2x3=A(x,y-2,p+2x3y-1y-1 +2x +2x33yy)+1)+1

Page 14: Bugs Integrated, Inc.     解题报告

第三种情况第三种情况 同上,也需要同上,也需要 pp 满足满足一定的条件:一定的条件:

ppy-1y-1=p=py-2y-2=0=0 由右图可得下面的结由右图可得下面的结论:论:

A(x,y,p)=S(B(x,y)-P)A(x,y,p)=S(B(x,y)-P)=S(B(x,y-3)-(P+E=S(B(x,y-3)-(P+Eyy+ E+ Ey-1y-1+E+Ey-2y-2))+1))+1=A(x,y-3,p+3=A(x,y-3,p+3y-2y-2+ 3+ 3y-1+y-1+33yy)+1)+1

Page 15: Bugs Integrated, Inc.     解题报告

在任何状态下,都先要考虑第一种情况,如在任何状态下,都先要考虑第一种情况,如果满足第二或第三种情况的条件,则应该取果满足第二或第三种情况的条件,则应该取几种情况的最大值。几种情况的最大值。 上面的讨论中,考虑的上面的讨论中,考虑的 yy 是大于是大于 11 的,对于的,对于yy 等于等于 00 和和 11 ,可得同样的结论。,可得同样的结论。 x=0x=0 的初的初始值全为始值全为 00 ,所以只需考虑,所以只需考虑 x>0x>0 的情况。的情况。 由上面的讨论可知,我们只需要记录最后由上面的讨论可知,我们只需要记录最后 33个方块个方块 (x,y)(x,y) 的数据,就可以一步一步的推到的数据,就可以一步一步的推到最后,而最后,而 A(N-1,M-1,0)A(N-1,M-1,0) 就是我们所要求的答就是我们所要求的答案。案。 算法的时间复杂度为算法的时间复杂度为 O(MN3O(MN3MM))

Page 16: Bugs Integrated, Inc.     解题报告

二、优化二、优化 150x10x59049≈9x10150x10x59049≈9x1077 运算时间运算时间 60s60s 左右左右 对于每个对于每个 (x,y)(x,y) ,都要计算所有的,都要计算所有的 pp 对应的对应的PP 的第的第 yy 个分量(还有个分量(还有 y-1y-1 、、 y-2y-2 )的值,)的值,这里重复计算很多。我们可以事先计算好这里重复计算很多。我们可以事先计算好每个每个 pp 的各个分量的值。这样处理以后,的各个分量的值。这样处理以后,时间减少到了时间减少到了 15s15s 左右。左右。 再通过一些细节的更改,最后时间能减少再通过一些细节的更改,最后时间能减少到到 8.5s8.5s 。。

Page 17: Bugs Integrated, Inc.     解题报告

三、进一步分析三、进一步分析 从从 MM ,, NN ,, PP 三个数上着手三个数上着手 MM 最大为最大为 1010 ,没什么好考虑的,没什么好考虑的 NN 最大为最大为 150150 ,, NN 减少减少 11 ,将减少,将减少 M3M3MM次次循环,我们考虑一个循环,我们考虑一个 6xM(2≤M)6xM(2≤M) 的子区域,的子区域,如果这其中没有坏的方块,则这个子区域如果这其中没有坏的方块,则这个子区域能被能被 2x32x3 的矩形填满。如果题目给的数据的矩形填满。如果题目给的数据中存在这样一个区域,我们可以把这个区中存在这样一个区域,我们可以把这个区域挖去,求得剩下的部分所能达到的最大域挖去,求得剩下的部分所能达到的最大值,再加上值,再加上 MM ,就应该是最后的答案。但,就应该是最后的答案。但是这样编出的程序是这样编出的程序 Wrong AnswerWrong Answer 。。

Page 18: Bugs Integrated, Inc.     解题报告

分析原因分析原因 问题在于:我们要求的问题在于:我们要求的 6xM6xM 的子区域的边的子区域的边界是规则的,而实际中如果子区域两边都界是规则的,而实际中如果子区域两边都是不占用子区域的最优情况,则有可能出是不占用子区域的最优情况,则有可能出现两边都浪费了现两边都浪费了 2x22x2 的小区域的情况,并的小区域的情况,并且它们不是平行的,连接到一起仍然不能且它们不是平行的,连接到一起仍然不能组成一个新的组成一个新的 3x23x2 ,这样就少计算了。,这样就少计算了。 如果改成要求如果改成要求 8xM8xM 或或 10xM10xM ,仍然会出现,仍然会出现类似的情况。再大的区域就没有意义了,类似的情况。再大的区域就没有意义了,即使算法正确,出现这样的数据的可能性即使算法正确,出现这样的数据的可能性也太小了。也太小了。

Page 19: Bugs Integrated, Inc.     解题报告

再考虑再考虑 PP 考虑右边这种情况:考虑右边这种情况:它表示它表示 PP 的一个局的一个局部。部。 图中阴影部分对于图中阴影部分对于摆放摆放 3x23x2 矩形没有矩形没有任何的贡献,所以任何的贡献,所以这种情况的值可以这种情况的值可以不用计算。不用计算。 我们用我们用 212212 来表示来表示这个局部情况这个局部情况

Page 20: Bugs Integrated, Inc.     解题报告

类似的情况还有几种:类似的情况还有几种: 101101 、、 102102 、、 201201 、、202202 00 到到 5904959049 中存在着上面中存在着上面 55 种情况的数一共种情况的数一共有有

4930049300 个,也就是说我们需要计算的只有不个,也就是说我们需要计算的只有不到到 1000010000 个。对于那些没有计算的,在后面个。对于那些没有计算的,在后面的递推中有可能用到。我们可以用一个数组的递推中有可能用到。我们可以用一个数组记录与每个不需要计算的记录与每个不需要计算的 pp 等价的等价的 p’p’的值的值(需要计算的值就是本身)。当需要用到(需要计算的值就是本身)。当需要用到 pp的时候,直接取的时候,直接取 p’p’的值即可。的值即可。

初步考虑初步考虑

Page 21: Bugs Integrated, Inc.     解题报告

错错 上面的考虑是错误的上面的考虑是错误的

考察右图,分别是考察右图,分别是 101101和和 102102 的情况,它们的情况,它们在在 S(B(x,y)-P)S(B(x,y)-P) 的的 (x,y)(x,y)处出现了问题,即那处出现了问题,即那个小方块对个小方块对 3x23x2 矩形矩形有贡献,不能拿掉。有贡献,不能拿掉。 类似的,类似的, 212212 也会出也会出现这样的情况。现这样的情况。

Page 22: Bugs Integrated, Inc.     解题报告

没关系没关系 我们需要计算我们需要计算 212212 、、 101101 、、 102102 这三种情这三种情况,只能去掉况,只能去掉 201201 、、 202202 这两种情况。这两种情况。 00 到到 5904959049 存在存在 201201 、、 202202 形状的数有形状的数有 2727936936 个,仍然能少计算很多。个,仍然能少计算很多。 我在耗时最短的程序的基础上进行修改,我在耗时最短的程序的基础上进行修改,然后提交……然后提交……

Page 23: Bugs Integrated, Inc.     解题报告

Ft!Ft! 耗时耗时 10s10s 前面预先需要处理的过程耗时不到前面预先需要处理的过程耗时不到 0.1s0.1s 计算计算 150150 ,, 1010 ,, 00 这组数据:这组数据: 未改过的耗时最短的程序需要未改过的耗时最短的程序需要 1.6s1.6s

改过的耗时最短的程序需要改过的耗时最短的程序需要 1.8s1.8s …………

Page 24: Bugs Integrated, Inc.     解题报告

四、关于标程四、关于标程 22 个标程:个标程: cc 语言的在限时语言的在限时 80s80s 的情况下超的情况下超时,时, pascalpascal 语言的语言的 wrong answerwrong answer PascalPascal 没细看,应该就是前面的算法。没细看,应该就是前面的算法。 CC 语言用的方法和上面所说的类似,只不过语言用的方法和上面所说的类似,只不过是一列一列的考虑,对于每一列从第一行是一列一列的考虑,对于每一列从第一行开始判断,对于每种情况再对下一行递归开始判断,对于每种情况再对下一行递归调用,直到最后一行。调用,直到最后一行。 下面简要的说说:下面简要的说说:

Page 25: Bugs Integrated, Inc.     解题报告

我们只考虑已经处理过的我们只考虑已经处理过的最后两列和当前列。最后两列和当前列。 S(B(xS(B(x00)))) 定义与前面类似,定义与前面类似,表示以表示以 xx00-2-2 为边界的左边为边界的左边部分部分 PP 的定义完全一样的定义完全一样 有四种情况: 有四种情况: (x-3,(x-3,y,x-1,y+1)y,x-1,y+1) (x-2,y,x,y+(x-2,y,x,y+1) 1) (x-2,y,x-1,y+2)(x-2,y,x-1,y+2)(x-1,y,x,y+2) (x-1,y,x,y+2) 构成新的构成新的 3x23x2 矩形。 矩形。 (左图显示了(左图显示了 33 种)种)

uu vv ww xx

Page 26: Bugs Integrated, Inc.     解题报告

五个参数的递归调用五个参数的递归调用srot(x,y,low,high,plus)srot(x,y,low,high,plus)xx 即当前列数,在随后的调用中不改变即当前列数,在随后的调用中不改变lowlow 、、 highhigh都是一个都是一个 PP类型的向量类型的向量plusplus 表示当前处理过的行中已经增加了多表示当前处理过的行中已经增加了多少个少个 3x23x2 的矩形的矩形yy 即当前行数,当即当前行数,当 y=My=M ,则将 ,则将 S(B(x-S(B(x-2)+low)+plus2)+low)+plus 的值与的值与 S(B(x)+high)S(B(x)+high) 的值比的值比较,去较大值赋给较,去较大值赋给 S(B(x)+high)S(B(x)+high)

Page 27: Bugs Integrated, Inc.     解题报告

srot(x, y+1, low+2*na[y], high, plus); srot(x, y+srot(x, y+1, low+2*na[y], high, plus); srot(x, y+1, low+2*na[y], high+na[y], plus); sro1, low+2*na[y], high+na[y], plus); srot(x, y+1, low+2*na[y], high+2*na[y], plus);t(x, y+1, low+2*na[y], high+2*na[y], plus); 若是若是 (x-3,y,x-1,y+1)(x-3,y,x-1,y+1) 存在一个存在一个 3x23x2 矩形矩形

srot(x, y+2, low, high+na[y]+na[y+1], plus+1); srot(x, srot(x, y+2, low, high+na[y]+na[y+1], plus+1); srot(x, y+2, low, high+2*na[y]+na[y+1], plus+1); srot(x, y+2, loy+2, low, high+2*na[y]+na[y+1], plus+1); srot(x, y+2, low, high+na[y]+2*na[y+1], plus+1); srot(x, y+2, low, higw, high+na[y]+2*na[y+1], plus+1); srot(x, y+2, low, high+2*na[y]+2*na[y+1], plus+1);h+2*na[y]+2*na[y+1], plus+1); 其他情况类似其他情况类似

一小段程序一小段程序

Page 28: Bugs Integrated, Inc.     解题报告

一直计算到第一直计算到第 N-2N-2 列,此时列,此时 S(B(N-2)+3S(B(N-2)+3MM--1)1) 就是所要求的结果。就是所要求的结果。

Page 29: Bugs Integrated, Inc.     解题报告

五、题外话五、题外话 课程主页上有这道题的解题报告,里面算课程主页上有这道题的解题报告,里面算法说得很清楚,所以实现起来很容易。但法说得很清楚,所以实现起来很容易。但是如何优化就需要认真去考虑。我一开始是如何优化就需要认真去考虑。我一开始选这道题作解题报告,主要是想看看助教选这道题作解题报告,主要是想看看助教的的 8s8s 的程序是怎么编的。我觉得看了助教的程序是怎么编的。我觉得看了助教的这个程序,比我自己去的这个程序,比我自己去 Judge OnlineJudge Online 上上做出做出 1010道题学到的东西还要多。这一点都道题学到的东西还要多。这一点都不夸张,因为只有把不会的东西转变成会不夸张,因为只有把不会的东西转变成会的才是进步。的才是进步。

Page 30: Bugs Integrated, Inc.     解题报告

完完