ZOJ Monthly, August 2012 总结|解题报告

       本次比赛由我、DTen和sssplk完成,一台机子进行。

      自从前天RP大爆发,从刷sgu比赛进前排开始到现在就一直被虐。前一场区域热身只水2题,这场又只做三题,真是罪过啊...

      这场比赛不是很难,也不是特别简单,但就是这样的比赛我们队只做了三题,两题线段树、一题并查集,其中第一题线段树在开场50分钟过掉,第二题并查集是84分钟过的,第三题线段树则到了200分钟。中间120分钟毫无建树,而后面100分钟也毫无建树,最后排名130,饮恨收场..

      说坏不说好,本场比赛由几个失误:

      1、第三题没想好细节就上去敲代码,结果很多地方一直调试,特别是一个只要输出arr[i]的地方偏偏去hash,然后hash完就各种乱,还有离散化也写得很离谱,不过我看一遍就知道哪里出问题了。

      2、最后一小时一直在做很多人过的K题,而不是去敲自己擅长的DP,我觉得这个时候的跟风十分不智,下不为例。其实K题是看错题目,直到最后10分钟才明白原来我错的那么彻底。

     

     到现在我们共A了8道题。现在说下这场比赛的题目(前面数字是题目在Zoj上的题号):

     Zoj 3633 Alice's present  官方题解是用树状数组,我们是用线段树过的。先对整个序列离散化,然后找出每个数前面出现的位置极为pre[i],没出现pre[i] = 0,如1,3,3,2,4,4,pre数组就是0,0,2,0,0,5.用pre数组建线段树,当我们要查询[l,r]的时候,就找[l,r]内的最大值,如果最大值小于l的话说明这个区间内没有相同的数,如果有就输出arrpre[i]]。为什么呢?其实最大值就是最靠区间右边相同那个数,如果小于l说明那个相同的数不在区间内,如果出现那很显然是最右边的。

     Zoj 3634 Bounty hunter  全场很少人过的DP,做的挺纠结的,我写了两个版本,一个是按照总结的想法,一个是按照官方的思路。但是我自己的想法就是没办法ac,咳,wa了20几次了。思路如下: 因为每次选择增加攻击力,对之前的状态都没影响,而是对之后的状态有影响,那就将对后面的影响考虑进来,后面全部的bi相加为sum,当前有的钱为money,可知在当前城市若增加攻击力,对后面的影响为money / ai * sum,那我们只要判断ai和sum大大小关系就可以决定在当前城市是否增加攻击力。还有一点,如果选择增加攻击力,那肯定是把钱全部用来增加攻击力,然后再换钱。谁能帮我想下这个思路是否正确。

     Zoj 3635 Cinema in Akiba  官方题解仍然是树状数组,但我们仍然是用线段树过的。用一个结构体存当前的下标和他在第k个位置,然后根据k和下标按k排序,k相等时再按下标从小到大排。每次只要找前面出现的比当前下标小的个数cnt,cnt+k就是他的座位号。

     Zoj 3636 Decode  据说是高斯消元,但是好像很高级的样子,不太会。

     Zoj 3637 Education Manage System  我擦肋,这题水题竟然没看到,真心坑爹啊。我的做法是先将日期转成一年内第几分钟,然后对课程进行排序,按开始时间排。然后就是DP,状态转移方程是DP[arr[k].end] = max{dp[j]} + arr[k]. (j <= arr[k].beg - 5),对课程的时间离散化处理,然后每次转移只要用线段树去查询0到arr[k].beg-5内的最大值就好了,一气呵成,没什么Trick。这题单调队列应该也可以做,不过官方没用线段树或者单调队列,而是开一个vector数组,把arr[k].end相同的放在一起,然后转移到dp[i]时,去找最大的dp[arr[k].beg],个人觉得这种方法比线段树方法来得简短、优美。


     Zoj 3638 Fruit Ninja 很经典的一类的容斥原理:带上下限的排列组合问题,做法是先消去下限,下限是强制性,因此可以从总数里面减去下限。然后问题就变成若干个带上限约束的排列组合问题。从相反方向考虑,用S1表示第1个水果不符合约束条件的总方案书,S2,S3意思如上,再用U表示全部方案数,答案就是ans = U - sum(s1+s2..sn) + sum(s1*s2+s1*s3...)..sum(s1*s2*s3..sn)(其中*表示集合交,+表示集合并)

     Zoj 3639 Guess a Function 目测是神题。

     Zoj 3640 Help Me Escape 概率DP,用逆序或者记忆化搜索来进行转台转移。dp[[i]表示攻击力为i时的期望,都很好写。

    那么状态转移方程为:if (c[j] < i) dp[i] += tj, else dp[i] += dp[i+c[j]] + 1;  

    Zoj 3641 Information Sharing 并查集。只不要每次并的时候都是两个集合并,要用set,然后a并到b的时候,a的set要销毁。

    Zoj 3642 Just Another Information Sharing Problem 据说是很水的网络流,但是不会。

    Zoj 3643 Keep Deleting 官方题解是KMP+栈,我是用KMP+链表。链表里面存的是前一个匹配到位置也就是A串和B串匹配时A串中位置。当A串匹配完,此时可以消掉,那么就让下一个字母和链表存的那个位置匹配。就这样一直匹配直到不能匹配为止。

     

     前面这些写得比较详细的,是我思考过的,我把它记录下来。Here是官方题解。

     部分代码和数据见:http://blog.csdn.net/woshi250hua/article/details/7915218


     本文ZeroClock原创,但可以转载,因为我们是兄弟。

你可能感兴趣的:(ZOJ Monthly, August 2012 总结|解题报告)