哈尔滨赛区网络预选赛总结
一共8道题,我们队最后AC了6道,队伍排名29,还不错.
刚开始比赛,早上9点,脑袋晕晕的,看了A题,是个计算几何,就是求一个车能否通过一个直角弯道,我画了画图马上觉得直接枚举角度,让车靠着一个顶点旋转就可以了,但是当时脑袋晕晕的,根本写不了代码,于是看B题,发现B题已经有些队过了,看来是个很简单的题目,当时急急的读完题目竟然把题目搞错了,前后写了2个版本的程序都没写下去,后来看有100多个队过了,心急了,我靠,今天rp不会这么差吧,这种题都过不了,下定恒心好好读下题,恍然大悟,果然是个简单题,于是三下五除二的写完代码提交AC了. 我写B题的时候hyh在写1007是个图论题,我搞完1002后就去看1006了,刚看完题hyh说他1007WA了2次,找不到错,让我做下1007,他来搞1006,我把1007看了下,就是个判断一个图是否为二分图并且求最大匹配.1007题是我今天状态的转折点阿!!最喜欢做这种题目了,打开editplus,狂敲一阵,中间没停过, 然后 越敲越兴奋,10分钟左右就敲完了,测试样例过了,于是交了,RE错误,omg,竟然出现这种错误了.把代码检查一遍,突然发现粘最大匹配模板过来的时候变量名重复了,我弱智了.... 改一改,交就AC了.这个时候hyh把1006也一次性AC了,我这时已经很兴奋了,然后hyh和wyb一起搞1001了, 我于是看其他的题目,看了一下1005,发现就是个状态压缩dp,只是在状态转移的时候比较复杂,我下定决心写了,于是开始写,也是一股气写完了,写完了发现状态转移的那个dfs搜索函数把我自己都吓倒了,一大堆的括号和位操作.... 然后花了点时间调试,确定没问题就交了,结果TLE了!! 看来测试数据很多阿 在自己的机子上跑极限数据一下就出来了,于是先用我的程序打个表,交上去就AC了!! 在我搞这题的时候hyh和wyb把1001搞定了. 这时一共搞定5道题了,剩下的1008基本没什么人交,估计很难,于是我来搞1003,hyh和wyb去搞数学题1004去了. 1003题目我前后读了6,7遍才大致了解什么意思,就是先求出一个凸包,然后在平面上找一个点,使这个点到凸包上所有顶点的距离之和最小. 这个点就是费马点,网上搜了下还是不知道怎么求凸包的费马点,后来用牛顿迭代法竟然过了!!! hyh和wyb搞1004一直都犹豫用那种方法,算法都想正确了,就差要快速的分解一个超大数的质因子了,由于高精度要求,决定用java搞了,wyb写了半天发现有问题,当时没什么时间了,我就开始重写,用最朴素的质因素分解,因为打素数表都要好长时间,写完了稍微改了下交了三个版本的程序,这个时候大家交程序都交疯了,等程序评测要等很长时间. 我们不停的刷status,最后竟然全部CE了!!! 我汗阿,猛然才发现我们的wyb大牛把java程序的类名建成MMain了..... 我是直接在那个类里面写的程序!! 狂汗阿!!!
下面把6个题的算法简单说一下:
1001 Turn the corner 枚举车靠着转角的顶点旋转的角度(0-90,步长0.001),然后看在这个角度下车子能否放到这个弯道中.
1002 The Mussels 把各个等级的管子和各个等级的蜗牛的个数全部存下来,然后按照等级1到等级n考虑,线性扫描一便计算就可以了。
1003 Watch out the Animal 先求出点集的凸包,然后用牛顿迭代求出最短距离和。
1004 ACM(Array Complicated Manipulation) 可以证明:只要n的质因子里面没有2个相同的,也就是质因子的阶只能为1,那么答案就是yes,否则答案就是no,由于数据范围超大,所以关键就在于怎么加速上面这个判断过程。
1005 Bricks 由于方块的高度最高不超过3,所以在放第i行时,只需要知道第i行和第i+1行的状态就可以推出i+1行和i+2行的状态,由于宽度小于等于6,所以可以用二进制压缩一个行的状态,用dp[i][j][k]表示在放到第i行时,第i行的状态是j,第i+1行的状态是j能够覆盖的最多格子数。然后根据不同方块的形状来枚举递推就可以了。
1006 Counter Strike 题目是求一个序列中平均数大于a的连续子序列有多少个。这样转换:把每个数减去a,化为求一个序列中连续子序列的和大于0的序列有多少个。设转换后的序列为b[],设s[i]表示b[1]+b[2]+...+b[i],则问题转换为求数对(i,j),使得j>i并且s[j]-s[i]>0,既j>i且s[i]>s[j],也就是求s数组的逆序对的个数。这个用树状数组或者分治都可以搞定。
1007 The Accomodation of Students 判断一个图是否为二分图:对图的每一个连同分量进行染色,相邻点颜色要不同,如果在dfs染色过程中出现矛盾,则图不为二分图。如果是二分图,根据染色的结果对顶点号进行映射,重新建立一个二分图, 然后求出这个二分图的最大匹配数就可以了。