赛时安排
7:50~7:55 读题
7:55~8:05 看了看T1,先写了T1的暴力,按照题意模拟。
8:05~8:40 然后看T2发现题意理解上有点麻烦,先往下看。看了看T3,手推了下样例,然后发现找到每一种羊出现的第一个位置,然后最后一个羊的种类的位置固定为n,然后跑Floyd。
8:40~9:20 接着回头看了T2,然后看了下第一档数据,想到只要找到每一个名字中只有一次的字母在字符串中出现的最多次数就行,然后扫一遍过了样例。
9:20~9:50 看了看T4的第一档数据。暴力按题目模拟。
9:50~10:15 接着看T3的大数据,将每一种羊互相能联通的位置连一条边,然后跑dijkstra。
10:15~10:50 又看了看T2,手造了一组第二个名字的样例,发现想的结论是错的…然后就想到拿名字一个一个往里面查,然后暴力搜。接着又看了看样例…发现题意理解的有一点问题,字母表中的每个字母只出现了一次,然后先找出第一遍中会出现的字符串,然后按照这个字符串来继续匹配,找到答案个数。
10:50~11:30 继续想了想T1的正解,手推出翻转后出现循环的位置,然后想了想将每一个点转移的位置进行连边,看看能不能上图上做…然后想不出来
11:30~12:00 又想了想T4,也按照T1想的上图的方法想了想…也没想出来…
12:00~12:10 交题
赛后总结
T1
这道题需要想的就是如何快速的进行 K ∗ M K*M K∗M 次操作,因为我们可以模拟得出每K次操作后,每个位置变动的下一个位置是一定的,因此我们可以在此基础上往下思考,然后看到数据范围就可以想到的就是倍增进行优化。
T2
这道题的思路…应该从数据范围上来看,看整体的数据范围,总共有26个字母,然后又减少了6个,也就是说每一串重复听到字符串的长度不超过20,显然就要用到状压来写,然后每一个位置为1的地方的字符表示出现在前面的字符串中,接着计算贡献只需要看当前字母的前一个位置的字母是否出现过,然后统计贡献就可以。
T3
这道题我当时想的类似于贪心的方法是有问题的,然后抛开贪心来想暴力,就是将所有品种能够互相传递的羊连一条边权为距离差,然后跑一边最短路。这样的复杂度是 O ( n 2 ) O(n^2) O(n2)的,然后就来想优化。我们发现所有的品种是不超过50个的,然后能否互相传递是品种之间而不是每单个绵羊之间,因此我们可以想到用分层图来考虑,第零层是原图,然后接下来第 i i i层的每一个位置的品种都当做 i i i,然后相邻两边的边权为1,然后通过将原图上的品种与所对应的那一层连一条边权为0的出边,接着再看哪些品种直接能互相联系,就将所有那个品种的羊与那一层对应的位置连一条边权为0的入边,接着跑最短路。画图后就能发现,这道题所要求的答案就是到n的最短路。当时写这道题的时候被贪心卡住了…然后就没往下想。
T4
这道题的思路就是先模拟出每一个点最后到达的位置,然后将这个点初始的位置和终止的位置连边,会发现能够出现多个环,然后dfs用双指针进行遍历求得答案就好了。