Codeforces

Portal

A. Antipalindrome

暴力。

B. Businessmen Problems

暴力。

C. Useful Decomposition

居然不是C打头的?!
将一棵树划分成若干条边不相交的路径,使得任意两个路径均有交点。
易知树上的两条路径最多有一个交点。若有三条路径两两相交,则必形成三个交点或一个交点。设路径1与路径2交于(v_1),路径1与路径3交于(v_2),路径2与路径3交于(v_3)。若(v_1 eq v_2 eq v_3),则有路径(v_1-v_2-v_3)形成环路,如原图为树矛盾;所以必有(v_1=v_2=v_3)。以此类推,原树划分成的所有路径都交于一个点。
那么原树中最多存在一个度数大于三的点(rt)(rt)就是交点。当(v)的度数为(1)时输出((v,rt))即可。

D. Bookshelves

将一个(n(nleq50))个数的序列({a_n}(a_ileq2^{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(jleq t leq i) ]

つづき...

Code

A, B, C, D

原文地址:https://www.cnblogs.com/VisJiao/p/9098443.html