Codeforces Round #240 (Div. 1) ABCD

转载请注明出处

题目链接

A:

把分数尽量放在第一对数对上,然后让剩下的数对两两互质即可,注意一些特殊情况(m=0或者n=1)

B:

dp[长度][当前最后一个数的大小],这样去转移:dp[len][x] = sigma(dp[len-1][y,y是x的因数]),因为每个数的约数都不多。

C:

建立归并树,求一下每一层新产生顺序对和逆序对

然后注意到,进行操作x时,只会影响归并树中第[x,n]层的逆序关系,那么就把对应层的逆序对和顺序对数量交换一下就好了,最后再O(n)统计一下当前的逆序对数,就是答案了

D:

容易知道答案只与树节点的层次分布有关,和树的形状无关,因此先预处理出dep[i]表示在dfs树中深度为i的节点有多少

然后这样得到答案:枚举每一层,考虑让最后这一层的水滴数最大,那么就是通过硬币让位于前面层的水滴延迟到这一层,代价为两层深度差,这里用线段树维护一下就好了


你可能感兴趣的:(ACM_Contest)