GDKOI 2013 参赛总结
第一次去DGKOI,见到了很多大神,也发现了自己的差距。
Day 1:
P1:琪露诺的教室
在一个W*H的矩形中,有N对整点,这2*N个点互不重叠,先要用线将每对点连接,线可以任意弯曲、环绕,但不能穿过2*N个点中的任何一个。问是否存在合法方案。
刚看题目时我就傻了,第一天第一题就这么难,我自己真实太水了。不过画了几个图后,我发现这题不过是排除两个顶点都在边上边,然后判断剩下的边是否相交。于是就想到了差积。不过我对差积的公式的记忆很模糊,幸好随便写的一条公式,经检验后竟是正确的。于是我长舒一口气,也没怎么细想就开始敲代码。没有注意到有两个顶点在同一条边界上的线的情况,这导致我这题只拿了18分。
P2:MMM比身高
有n个人(编号0—n-1),给出M个关系,u v a b表示a≤height[v]-height[u]≤b。现在问这n个人当中最高的那个人比0号高多少。
没有比这更裸的查分约束系统了。就是把题目转化为几个不等式,然后用最短路进行查分约束。我是用SPFA来做的,纪录一个点入队次数来判断有无负环。这道题可能是全天得分率最高的题目了,因为很多大神第一题都敲错了。
P3:琪露诺的完美算术课
设a,b,c为一个三角形的三条边。给出[x,y],求出a∈[x,y]且满足c^2≤a^2+b^2≤c^2+1的边长均为正整数的三角形个数。(2≤x,y≤10000000)
这道题真是纯粹的数学题。我果断打表,只过了3个点。这是我第一次在考试时打表,感觉很不错。而且考完后我发现大部分人都是打表,都是冲着那12分去的。但用的时间却不同,有的人用了半个小时,有的用了5分钟,有的则用了1分钟。因为他们的枚举方法不同,而打表时候电脑很卡,容易影响比赛心情。所以,尽管时暴力打表,还是要尽力优化。
正解: 将式子转化一下:
a^2=c^2-b^2=(c+b)(c-b)
a^2-1=c^2-b^2=(c+b)(c-b)
这样我们很容易想到将a^2和a^2-1分解因式,又由于c和b都必须是整数,因此必须保证c+b和c-b的奇偶 性相同。我们可以将被分解数进行质因数分解,然后将不是2的每个质因数的个数加1然后相乘。然后讲剩 余的2分配到两堆中,这些都可以用较简单的组合数学来解决。但是这还是不够的,因为将x到y的每个数都 质因数分解就已经超时了,若是用筛法求素数,就可以在线性的时间内完成,然后就不会超时了。
P4:大山王国的城市规划
有一个长度在100000以内的字符串,想找尽可能多的回文子串,而且使得这些回文字串互不为对方的子串,问最多能取多少个子串。
第四题,我看完题目后就觉得很神奇,100000的字符串,难道有一种算法能有O(n)的效率?比赛时,我做到这一题时还剩两个小时,于是我用暴力算法,能过一个点是一个点。结果我就真的只过了一个点。而直接输出字符串中字符种数也是过一个点,但编程复杂度却是天壤之别。
正解:超越理解范围
Day1总的来说考的还算不错,但是考试时自己心里很没底,因为对所用的算法没有信心。所以,以后要好好复习高级算法。
Day 2:
P1:MMM军团
题目大概是说,有n个人,每个人认同若干个人,现要在这n个人当中挑选一些人,使得满足以下条件:选中的人要互相认同,且他们只认同选中的人。被选中的人要被所有的人认同。问最多能选多少人?
这题还挺简单的,n范围很小,用广搜直接过。
P2:贪吃蛇
题目给出一个N*M的地图,地图上的每个格子都有一些食物,食物的分值可能为正,也可能为负。游戏开始时,可选择一个初始位置和一个初始方向。游戏开始后,沿着原来的方向前进,并累加经过格子的食物的分值。游戏中只能拐一种弯(要么全部向左拐,要么全部向右拐),越出边界或者所走路线交叉,游戏就结束。问游戏结束时最高分是多少。
我看了32*32的数据范围后就认为这是道搜索。但没想到什么好的剪枝方法,于是就是最基本的搜索。写了我200多行,幸好没出错。谁能想到这竟是一道DP题。
正解:由于只能拐一种弯,通过分析样例,发现路径可以在中间分开,分成两个矩形,而这两个矩形就是两个子问 题。继续分析,矩形中走若干步后兜回来,又会形成一个更小的矩形,这又是一个更小的子问题。因此我们 可以预先通过DP,计算出以每一个点为起点,另一个点为终点的矩形,转的是哪一种弯,得到的最高分是多 少。DP完后,在枚举分割的位置,然后枚举两边的矩形,最后统计一下求最大值。
DP时间复杂度是O(N^4*2),枚举时用了O(N^5)的时间。
P3:MMM二进制
大意是,给出N(1≤N≤50000)个非负整数。现有M(1≤M≤100000)个操作,操作有5种类型:
(1)and L R x 将第L到R的所有数都与x进行and操作。
(2)or L R x 将第L到R的所有数都与x进行or操作。
(3)xor L R x 将第L到R的所有数都与x进行xor操作。
(4)qxor L R 询问第L到R的所有数进行xor操作的结果。
(5)qsum L R 询问第L到R的所有数之和。
处理qsum时,我想到了树状数组,但qxor我就只能暴力枚举了。本以为这能让我和全部枚举的拉开一点差距,但后来发现结果是一样的。
正解:线段树
P4:MMM函数
题目大意为,给出一棵有N(0
0 p w 将节点p的美味值加w。
1 p 询问节点p的美味值。
用了个类似 最近公共祖先 的方法,可惜一个点没过。
正解: 据说是树链剖分。
Day 2 考完后,坐在我旁边的一个同学说:
“我去,肥平你怎么题题都用搜索?”
“如果我会用其他的算法,一定不用搜索。”我只能这样回答。
这次比赛是我运气好,题目都很极端,要么很简单,人人会做,要么很难,大神都不会。
而我则因为简单题没有出错,所以成绩还可以。但不能说明我的实力。