写在前面
彻底自闭了。。。本想把暴力分拉满,然后少了20pts,直接从上小分变成了掉大分。。。
考试ing + 考试中的思考 + 正解
T1(14:00 — 15:00 + 17:10 — 17:40)
考场上的我思维被禁锢住了,这道题本来是一道裸的堆优化dij再加上一些打表找规律的剪枝,但是由于这个题披着一层数论的皮囊,我直接当做的数论去写了,然后去推所有的ans[i][j],发现根本推不了,最后想通过打表找些规律,然后自然sw。。。
正解是:其实在每次x到y的变换中,可以发现,是固定的关系,并且最后需要求的是最小值,所以这自然想到了图论的dij最短路,就是,在每次
x
=
x
∗
z
m
o
d
p
x = x * z \ mod \ p
x=x∗z mod p的时候,将
x
x
x 和
x
∗
z
m
o
d
p
x*z \ mod \ p
x∗z mod p 建边,其遍值为
z
z
z (也就是题上的
a
b
s
(
x
−
z
)
abs(x - z)
abs(x−z)),所以,从1到p - 1 去枚举每个边,然后丢进前向星里即可,然而如果想要获得更高的分数,那么需要考虑去通过剪枝:打表可以发现到后面计算出每个点的最短路都不会小于15-16,所以,在建边的时候,只需要基于这一个点,向左向右只需要扩17个点即可,这样就可以达到从
O
(
p
2
)
O(p^2)
O(p2)到
O
(
p
∗
17
)
O(p * 17)
O(p∗17)这样的优化了,非常的 块 快,然后就是正常的最短路求即可
总结(仍然是很重要的经验)
- 不要被考场上的惯性思维所禁锢住,如果一直禁锢在一个思路里,并且不能保证这个思路是正确的,那么一定要换一个思路,比如这场的T1,我一直当做数论的题目来写,一定是过不了的,听隔壁的图论之神布老师说考场上他想的第一个思路也是数论,但是发现推不出来,这时候他就重新看了一次题目,发现在每次求解ans数组时,每个关系是确定的,并且答案是要求ans累加的最小值,那么就直接想到了图论的最短路,并且把所有的关系全部转换成了图论的关系,这就是我目前阶段应该学会的技巧。
- 大暴力dfs一定要打,因为在考场上大暴力dfs有几个作用:第一:打表找规律,有时候规律不能通过样例和题面一样看出来买这时候打一个很慢的dfs,即去枚举每个全排列(或者每种情况),寻找规律,这时候打表的过程中可以去码其他的题目,或者出考场洗脸冷静一下,回来卡准点查看就行;第二:有保底分数,意味着考场上这道题你是有记录的,并且你拿到了这个题的最低档分数,可能在最后会就救自己一命**;第三:去用于对拍,码完dfs后,就可以通过dfs优化或者去码高档分数或者正解,这时候可以判断写的正解到底是不是正解,或者有没有什么细节上的错误
- 注意时间分配:考场上的时间极其宝贵,如果在途中码一道题的时间超过了50min,就需要出去洗个脸,并且冷静下来告诉自己一直盯着一个题的收益有多大,如果可以在很短的时间内码过这个题,那么就再给自己一点时间,如果不行,果断放弃这个题目,等回来做完剩下的题目或者拿完了暴力分之后再回来继续攻克。
- T1,T2一定要深度思考(除非是大摸你):因为由于难度的递增,T1,T2不可能会特别难(除了万一情况),所以T1和T2一定要深度思考,不能简单了事,用大部分的时间去攻克T1和T2,最后的成绩必定不会差QWQ(前几场的模拟赛都是因为在T1和T2的分数不高然后才掉大分的,所以今后的比赛要争取T1和T2的AC)