NOI模拟赛 4.28
赛时时间安排
读题
7:35-7:50:读题+适应Linux环境,感觉今天的题比上一次Day1难很多
T1
7:50-8:10:想了20分钟T1一无所获,看上去今天的题不是按难度排序
T2
8:10-8:50:快40分钟的时间过去,几乎没码代码,就在纸上画了一堆竞赛图
8:50-9:30:灵机一动,发现(回想起)了竞赛图缩点后是链的性质,随后又根据之前画的一堆图整理出了递推式子
9:30-9:50:顺利码完T2(噩梦的开始)
T1
9:50-10:15:糊完了T1的30pts的暴力,然后发现70pts可以转化成O(m) 次添加或删除边的操作,但Tarjan
的复杂度掉不下去,还是打不出70pts
T2
10:15-10:35:按套路理完了前两档部分分的思路
10:35-10:55:打完了第一档部分分
10:55-11:25:打+调完了第二档部分分
赛后总结反思
关于T2挂分
发现T2忽略了模数不一定是质数的问题,挂成了30,回想起赛时的历程:
打完T2开始检查-->
随便试了组数据-->
诶,我的代码怎么输出零啊-->
哦原来我输入了一个合数当模数啊-->
将模数改为质数继续试,然后觉得没啥问题了。。。
赛后回想起,欲哭无泪,打代码打得惯性太强了,程序都输出零了还没发现问题。。。
一定要警惕这种脑抽/惯性思维导致的错误
关于检查
个人在比赛结束前会对代码进行非常详细的1-3次检查,包括但不限于:文件名/文件输出输出、数组大小、输出调试、代码现在还能否过各个样例等,一般花费十分钟左右,但今天由于对操作系统不熟悉在最后交题之前并没有完成对T3的检查,应继续熟悉操作系统。
关于T1的70pts
今天T1的70pts需要引入另一种求强联通分量的算法Kosaraju
,但这种算法的思路并不算人类智慧,并不是完全不可能想出,且对Tarjan
的写法进行适当更改后也可以完成同样的事情,这或许其实我们:有时候需要根据数据/题目特性对经典算法的经典写法进行适当的改写,必要时甚至可以放下经典算法,另起炉灶。
关于T1的100pts
近期题目中似乎根号数据结构在越来越频繁地出现,并且在这类数据结构问题中,常数问题常常显得非常重要,很多时候正解和暴力的主题相差不大,区别就在于运用各类思想和数据结构不断去降低/平衡复杂度,降低常数,在今后思考更高档分数时,如何在不调整主体算法的前提下降低复杂度也应列入思考范围。
知识性收获
T1:降低复杂度技巧
1.bitset降低图论问题遍历点/边常数
2.分块问题若仍需要对整块进行操作可以考虑进入其它数据结构进行进一步优化
T2:竞赛图的性质
竞赛图强连通缩点后的DAG呈链状,竞赛图的强连通块 存在一条哈密顿回路,竞赛图存在一条 哈密顿路径