Codeforces - Avito Code Challenge 2018
A. Antipalindrome
暴力。
B. Businessmen Problems
暴力。
C. Useful Decomposition
居然不是C打头的?!
将一棵树划分成若干条边不相交的路径,使得任意两个路径均有交点。
易知树上的两条路径最多有一个交点。若有三条路径两两相交,则必形成三个交点或一个交点。设路径1与路径2交于\(v_1\),路径1与路径3交于\(v_2\),路径2与路径3交于\(v_3\)。若\(v_1\neq v_2 \neq v_3\),则有路径\(v_1-v_2-v_3\)形成环路,如原图为树矛盾;所以必有\(v_1=v_2=v_3\)。以此类推,原树划分成的所有路径都交于一个点。
那么原树中最多存在一个度数大于三的点\(rt\),\(rt\)就是交点。当\(v\)的度数为\(1\)时输出\((v,rt)\)即可。
D. Bookshelves
将一个\(n(n\leq50)\)个数的序列\(\{a_n\}(a_i\leq2^{50})\)划分成\(m\)段,使得每段的和的按位与和最大。
从高位向低位DP。做到第\(k\)位时,记录\(ans\)表示从最高位到第k-1位能取到的最大值。\(dp[i][j]\)表示在满足最高位到第k-1位依然是\(ans\)的情况下,把前\(i\)个数分成\(j\)份能否让第\(k\)位为\(1\)。
\[dp[i][j]=\exists t,dp[t-1][j-1]为真且sum(t,i)\& ans=ans,sum(t,i)在二进制下的第k位为1 \quad(j\leq t \leq i)
\]