时间安排
7
:
55
−
8
:
20
7:55-8:20
7:55−8:20 把四道题都看了一遍,T1,T2感觉可写,T3看上去像tarjan,T4没什么思路。
8
:
20
−
9
:
00
8:20-9:00
8:20−9:00 看到前缀和后缀很容易想到trie树(后缀就是反串的前缀),就考虑对n个字符串建一个tire树,再记录一下l和r表示在tire树上的位置,再将字符串反过来建一个可持久化trie树来统计答案。对于每一组询问,先在普通trie树上查找前缀所在的区间l和r,然后在可持久化tire树上用前缀相减求出答案。
9
:
00
−
10
:
00
9:00-10:00
9:00−10:00 一直在调tire树,很久都没码过可持久化数据结构了,细节很多,比如在树上的位置要不停的更新,可持久化的赋值,加权。最后样例是过了,自己造了几组小数据也过了,就去看T2了。
10
:
00
−
10
:
30
10:00-10:30
10:00−10:30 对于T2,首先区间一定越长越好,因为这样一个最大值的贡献才会最小,当时的想法是贪心,对于整个区间求出最大值所在的位置,然后向左右扩展,直到第一次出现重复的元素,然后将剩下的区间递归处理,每次累加一下最大值,最后输出答案。
10
:
30
−
11
:
10
10:30-11:10
10:30−11:10 对于T3,我的第一想法是tarjan求所有的桥边,然后记录ans1为桥边中属于原树的边的数量,ans2为桥边中属于新增的边的数量,然后答案就是
a
n
s
1
∗
a
n
s
2
ans1*ans2
ans1∗ans2,很明显是错的,因为不一定只有两条边都是桥边的情况才能使图不连通,我先写了一个暴力,就是对于枚举所有的边,标记一下要删的边,然后dfs判断是否联通,看着时间不多码完就先去看T4了。
11
:
10
−
11
:
50
11:10-11:50
11:10−11:50 T4很有意思,很明显,K是有规律的,我先推了一下样例,我最初的想法是暴力求出n和2n的答案,然后答案就是
a
n
s
1
+
(
a
n
s
2
−
a
n
s
1
)
∗
(
K
−
1
)
ans1+(ans2-ans1)*(K-1)
ans1+(ans2−ans1)∗(K−1),但是错的,因为你不能保证以后的K不会对之前的有影响。我先试着推了推K=1的情况怎么写,刚开始我的想法是对于先把环处理一下,又是个环就ans++,然后把环去掉,对于接下来的字符串,如果对于
s
[
i
]
s[i]
s[i] 来说,
s
[
i
−
1
]
s[i-1]
s[i−1] 和
s
[
i
+
1
]
s[i+1]
s[i+1] 都与
s
[
i
]
s[i]
s[i] 不同(这里的不同指的是不在同一行或同一列,即一个为’W’,一个为’N’,或一个为’W’,一个为’S’),然后
s
[
i
−
1
]
s[i-1]
s[i−1] 和
s
[
i
+
1
]
s[i+1]
s[i+1] 在相同的情况下又要本质不同,这样就可以求出
s
[
i
]
s[i]
s[i] 之前的最长的
s
[
i
−
1
]
s[i-1]
s[i−1] 串和
s
[
i
]
s[i]
s[i] 之后的最长的
s
[
i
+
1
]
s[i+1]
s[i+1] 串的最小值,直接累加到答案。
反思
我到现在还是不理解为什么我T1的代码会挂,我觉得写的没问题,而且过的数据还都是大数据,然后小数据WA了,我对T1寄以厚望,觉得能A才花了将近两个小时,导致后面的时间很紧,静不下心来思考,总体来说还是时间安排有问题。以后还是苟起来打暴力吧,连续两场考试我都有AC的心,但教训太惨痛,苟起来坐等大佬翻车。