时间安排
8
:
00
−
8
:
20
8:00-8:20
8:00−8:20 把四道题都看了一遍,T1是个dp,T2暂时没什么思路,T3类似于卡特兰数,T4也没什么思路。
8
:
20
−
8
:
50
8:20-8:50
8:20−8:50 对于T1,刚开始我没想区间dp,想到了线性dp,设状态
f
[
i
]
[
0
/
1
]
f[i][0/1]
f[i][0/1] 表示考虑完前
i
i
i 个,并且第i个选/不选的最大的
∑
w
\sum w
∑w,先把整个区间排好序,当时想的转移式是
f
[
i
]
[
0
]
=
m
a
x
(
f
[
i
−
1
]
[
0
]
,
f
[
i
−
1
]
[
1
]
)
,
f
[
i
]
[
1
]
=
m
a
x
(
f
[
p
]
[
0
]
,
f
[
p
]
[
1
]
)
+
w
p
f[i][0]=max(f[i-1][0],f[i-1][1]),f[i][1]=max(f[p][0],f[p][1])+w_p
f[i][0]=max(f[i−1][0],f[i−1][1]),f[i][1]=max(f[p][0],f[p][1])+wp,其中
p
p
p 为前
i
i
i 个中第一个r小于当前r的位置。这个dp应该是错的。(但不知道为什么)
8
:
50
−
9
:
30
8:50-9:30
8:50−9:30 对于T2,由于是相邻的两个点之间有联系,我就想到了邻接矩阵,接下来就显而易见了,就是在n行的邻接矩阵中找最小的行数使得它们异或起来的每一位的值都为1,就先写了一个
O
(
2
n
)
O(2^n)
O(2n) 的暴力,就去看T3了。
9
:
30
−
10
:
30
9:30-10:30
9:30−10:30 T3是花时间最长的,我发现其实就是对于一个在左上角的点,只能向下或向右走,设其中转折点的个数为i,则此时的方案数为
2
n
∗
n
−
i
2^{n*n-i}
2n∗n−i 因为只要在转折点设一个喷洒点,其他的位置随意摆就行,所以难点在于求每种方案的转折点的个数以及如果当前转折点为w怎么写,我推到半点后就直接放弃去看T4了。
10
:
30
−
11
:
10
10:30-11:10
10:30−11:10 对于T4,最小值最大,肯定是个二分,但是又不会判定,我对于链的理解是两端必须都是叶子节点,所以我建了一个反图,对于所有的叶子结点做了一遍bfs,找到第一个已经被修改过的节点,此时的值即为两叶子节点的最小距离,直接输出。
11
:
10
−
11
:
30
11:10-11:30
11:10−11:30 我用set来优化了一下T1的
O
(
n
2
)
O(n^2)
O(n2) 的算法,用lower_bound在
l
o
g
n
log\,n
logn 的时间内找到了第一个小于当前r的位置(即
p
p
p),整体时间复杂度为
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn),虽然结果都一样。
11
:
30
−
11
:
50
11:30-11:50
11:30−11:50 又去试着写了写T3。
11
:
50
−
12
:
10
11:50-12:10
11:50−12:10 检查文件,提交。
和正解的差距
T1
我认为当整个区间排好序后,此时线段大致是平均的分布在 1 − n 1 - n 1−n 的区间上,由于左端点有序,所以后续的dp没有后效性,我觉得这个思路没什么问题,不知道为什么错了。刚看到n的范围觉得可能是区间dp,但是我觉得是这个是对的,就没多想。
T2
T2的话主要的瓶颈还是在如何快速找每一位上的奇数/偶数个1。
T3
T3当时没想到时dp,只觉得是对于每一种情况可以推出什么式子然后组合数+2的幂次乱搞,所以就一直在推对于每一种n,所有情况的转折点的数量的规律。
T4
T4问题主要在于对链的理解,其实当时我还是有所怀疑的,因为如果是我那种做法的话就太简单了,但是样例也过了,自己造的数据也用的是错误的方法,暴力也是错误的暴力,导致对拍也拍不出来。
考试总结
还是对dp不够敏感,想不到正确的dp式子,dp的状态也很难设,还有就是在T3上花的时间太多了,当时推的时候觉得有思路,可以推,我原本打算推20分钟就不推了,但是推上头了,直接推了将近一个小时,但就差最后的dp没推出来,导致暴力也没写,时间也浪费了,还有就是读题的时候太想当然,以及样例太少也没清晰的解释。