GDKOI 2013 参赛总结

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<N≤100000)个节点的数,若某个节点i的美味值加w,那么所有的节点j的美味值会增加dist[i,j]+w。初始值每个节点的美味值为0。先有M(0<M≤200000)个操作:

    0 p w 将节点p的美味值加w。

    1 p 询问节点p的美味值。


    用了个类似 最近公共祖先 的方法,可惜一个点没过。


正解: 据说是树链剖分。


Day 2 考完后,坐在我旁边的一个同学说:

     “我去,肥平你怎么题题都用搜索?”

     “如果我会用其他的算法,一定不用搜索。”我只能这样回答。


    这次比赛是我运气好,题目都很极端,要么很简单,人人会做,要么很难,大神都不会。

     而我则因为简单题没有出错,所以成绩还可以。但不能说明我的实力。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值