Welcome to Yumao′s Blog.
2010 acm 浙江省省赛 Judge’s View && 解题报告
, 2010年04月18日 , , 评论 在〈2010 acm 浙江省省赛 Judge’s View && 解题报告〉中留言功能已關閉 ,

前言
1.省赛题目作者有5人,出题数分别为fib(0),fib(1),fib(2),fib(3)和fib(4)
2.关于各项预测
赛前估计的难度顺序是L A B E G F H K J C I D
   实际的难度顺序为L A B E G K F J H C I D,K的预测失败,其他差不多
赛前估计所有题目都有提交
   Bingo
赛前估计通过做多的是L题
   Bingo
赛前估计D没有队伍过,其他题都有队伍过
   Bingo
赛前估计I只有一个队伍过
   Bingo
赛前估计第一名10题
   第一名11题
赛前估计第一名和第二名没有题数差距
   题数目差距为2
赛前估计ZJU夺杯
   Bingo
赛前估计ZJU金牌数为3或4
   Bingo,三枚金牌

以下为简略的解题报告

A Who is Older? 秒杀 54.42% (283/520) / 71.58% (383/535)
本题最简单的方法是得知javaman和cpcs其实是同一个人,于是他们的生日永远是一
样的,直接打出same即可。不过,我是鸡丁。

B Somali Pirates 秒杀 59.40% (278/468) / 69.69% (345/495)
验题的时候,javaman大大告诉我,这题case数没用的,整个input从头到尾用
getchar读,把数字全部扔掉即可,很飘逸。

C Machine 中等 8.00% (2/25) / 8.23% (14/170)
这题要用线段树来实现O(MlogM),如果对线段树熟悉的同学看完题应该就会往线段树
的方向想,剩下的就是线段里面记录点什么东西问题。当然这个模型也不会太难想,
既然题目问的是一共有多少个连续块,那么我们就直接记录一条线段上有多少个连续
块。剩下的问题就是,某些时候一个连续块会在线段一分为2的时候被切成两半,于
是统计的时候是不可以直接把两条子线段的值相加的。做法就是记录每条线段的最左
右端是否属于连续块的某一部分,对于一条线段,如果他的左子线段的右端,以及右
子线段的左端都是连续块的一部分的话,那么就应该在两个儿子值的和上减去1,因
为那两部分是属于同一个联通块的。剩下的就是一般的线段树的实现了。因为线段树
的题做得不多,不知道是否有和此题比较类似的模型存在。
赛后发现大家对于线段树都不太敢写,最后也只有2个ZJU的队伍过了,可能大家或多
或少被前面的题卡了,不想写这么复杂的题吧。

D Next Expression 难 0.00% (0/2) / 0.00% (0/0)
VB出的一个比较恶心的题,给一个带括号的四则运算表达式,根据式子中运算符的执
行顺序定义了表达式的字典序定义:看两个表达式最后一个不一样的运算,运算符在
式子中更靠后的那个表达式,字典序更小。原题描述还是比较绕的,我这样写成中文
还是感觉比较绕,这里需要好好理解一下。
当然,问题的第一步是解析表达式了,这里是卡递归的……于是我是自己手写堆栈来
解析,于是表达式就解析成一棵树,执行顺序是“左右中”。接下去要找字典序的下
一个,当然是递归的找了,先尝试只调整左边的,不行的话再尝试调整右边的,还是
不行的话,只能改变中间最后一个运算符的位置了。要注意的是,某棵树一旦由子树
调整了以后,响应的左子树也要调整到字典序最小的。
最后,要输出调整后的表达式,当然,还是不能递归o(╯□╰)o,果然是要写一个晚
上的题。

E An Awful Problem 简单 17.81% (173/971) / 26.68% (210/787)
这题相比于几个秒杀题来说,只是稍微麻烦一点而已,主要就是日期、闰年的处理。
数据范围并不大,即使是直接暴力判断也是可以过的,当然优化的方法有很多:可
以把1000-2999年每一天都一算一次,每天记录一个总和,然后对于每次查询就是两
个总和的相减了。还可以对于整年的时间不一天一天枚举,因为只有闰年和非闰年
两种情况,于是最后的枚举量只有差不多年数+一年的天数。

F Friend Number 中等 4.73% (9/190) / 11.27% (15/133)
典型的彩票格式题:题面短,时限短,需要YY。这题的做法是从后往前枚举,枚举哪
一位发生改变(一定是变大),因为要求总的乘积不变,因此要求从这位开始的后面
一串的乘积不变。枚举这个数字增大多少,然后判断是否可行,也就是判断是否可以
有x个数字的乘积恰好为y。这个其实只要从9开始从大到小贪心的放就可以了,可以
证明,而且放出来的一定是字典序最小的。具体的做法可以从后往前,只需要记录
2 3 5 7四个因子的个数。除此之外,还需要特别注意原数字中有0个情况。

G Wu Xing 简单 28.67% (121/422) / 50.31% (240/477)
这题题目稍微有点长,然后introduction部分还分布了不少的GRE单词,不过答案其
实很简单,就是N/2。考虑一共需要x个interaction,对于第i个interaction,我们
让每个节点t对节点t+i连一条有向边,这样的话,每个点刚好一个入度一个出度,并
且这种情况下,肯定是一些环,于是满足要求。每个关系可以让一个点多两条边,所
以x=N/2。

H One Person Game 中等 2.77% (3/108) / 4.96% (15/302)
这题的思想和07年校赛的左电梯比较类似。dp用来表示当前总和为i时,到游戏结
束的期望步数。则当i>n时,dp=0,否则dp=sigma(p[k]*dp[i+k])+pp*dp[0]+1
其中p[k]为扔到总和为k的概率,pp为扔到abc的概率。这个时候按照左电梯的思路,
是要写成矩阵然后高斯消元,不过这题的n有500这么大,又有300个case,N^3的高斯
消元显然是吃不消的。观察后发现,每个dp除了跟dp[0]有关,就只和比i大的dp
值有关了。于是,我们可以让i从n到0,一路都把dp表示成dp[0]的一次函数,最后
就是一个dp[0]=a*dp[0]+b的式子了,直接解出dp[0]即可,复杂度非常小。

I Country F 难 6.66% (1/15) / 4.00% (2/50)
这题首先的问题就是如何判无根数的同构。似乎见过很多有根树的同构问题,差不多
就是一个把子孙最小表示、排序的方法。而对于无根树,这样的方法行不通,因为你
不可能枚举每一个点来作为根。所以,主要的问题是怎么样来把候选的根的数量限定
到一个很小的范围内,然后尝试有根树的方法。其实方法很简单,我们每次把一棵树
的所有叶子节点去掉,重复这样的操作,最后一定只剩下一个或者两个节点,可以证
明只要选取这一或者两个节点中的一个来作为根节点就可以了。
剩下就是如何最小表示一颗有根树了,我用的是杨弋论文中的hash算法,需要注意到
RK算法中的hash在这里是不适用的,我做SRM的时候就挂了一次。当然,杨弋中的论文
也提到了无根树的hash法,不过我没太仔细看,不知道是和上面的方法差不多还是新
的方法。
关于无根树的同构问题,还有一个方法,写起来非常方便的,不过我不太会证明,就
援引cerror前辈的原话:
“对每个节点,导出一个list,表示它所连接的节点的度……生成了n个list,然后逐
一比较,不相等就一定不同构。但是对一般图来说,相等也不一定同构(《组合数学》
上有定理和反例)。然而对树来说,这组导出的list是唯一的和一一对应的,就是说
有了一棵树,就一定可以导出一组list,而有了一组list,又可以反过来生成一棵树,
如果是无根树的话,这样的生成是没有争议的。所以,

评论已关闭