B.Tournament
连边 a i → i a_i\to i ai→i, 构成一颗树。
i i i需要在不同层打败他指向的所有选手。
设 f x f_x fx表示 x x x打完所有比赛且为最终的赢家时的子树深度。
递归处理完 x x x指向的所有选手 y y y后,贪心按 f [ y ] f[y] f[y]降序排序得到序列 q q q,从小到大安排到每一层, f [ x ] = m a x ( f [ q [ i ] ] + i ) f[x]=max(f[q[i]]+i) f[x]=max(f[q[i]]+i)。
C.Division into Two
真的zz,DP都多想了一维…
实际上只需要转移一块一块的整体,并维护集合的不断交替。
考虑 d p dp dp:
设 f [ i ] [ 0 / 1 ] f[i][0/1] f[i][0/1]表示处理到第 i i i位, S i S_i Si划分到了 A / B A/B A/B集合,且 S i + 1 S_{i+1} Si+1被划分到另一个集合的方案数,转移:
f [ i ] [ 0 / 1 ] = ∑ f [ j ] [ 1 / 0 ] f[i][0/1]=\sum f[j][1/0] f[i][0/1]=∑f[j][1/0], [ j + 1 , i ] [j+1,i] [j+1,i]