码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #496 (Div. 3)

时间:2020-09-17 21:27:54      阅读:22      评论:0      收藏:0      [点我收藏+]

标签:media   edit   表示   case   short   car   题意   生成   进制   

ABC咕咕咕

D. Polycarp and Div 3

题意:给一个数字串,问最多能选出几个不相交的子串使得它们组成的 \(10\) 进制数都是 \(3\) 的倍数。

\(|s| \leq 2\times 10^5\)

题解:

\(dp_{i,j}\) 表示第 \(i\) 为,数字和 \(\%3\)\(j\),最多选出几个子串。

\(O(|s|)\)

E2. Median on Segments (General Case Edition)

题意:给一个序列 \(a_1 \cdots a_n\),求有几个子区间的中位数是 \(m\)。(长度为偶数的中位数算小的)

题解:

首先原序列的元素并没有意义,只有和 \(m\) 的大小关系有意义,把 \(=m\) 的标成 \(0\)\(<m\) 的标成 \(-1\)\(>m\) 的标成 \(1\)

假设一个集合里面有 \(x\) 个数 \(=0\),则只有这个集合里面所有元素的和 \(\in [-x,x+1]\) 才合法。

考虑容斥,先算和 \(<-x\) 的子区间个数。

如果插入一个 \(-1\) 相当于给和 \(-1\),插入一个 \(1\) 相当于给和 \(+1\),插入一个 \(0\) 相当于给 \(x-1\)

要看 \(-x\) 跟和的大小关系,就考虑和 \(-(-x)\) 的值。

\(-1\) 标成 \(-1\)\(1,0\) 标成 \(+1\)

问题就变成了求和 \(< 0\) 的子区间个数,把前缀和求出来,用树状数组维护每个前缀有几个比它大的即可。

\(\leq x+1\) 的子区间个数方法类似,不过把 \(0\) 标成 \(-1\),不详细说了。

\(O(n\log n)\)

F. Berland and the Shortest Paths

题意:有一个 \(n\) 个点 \(m\) 条边的无权无向图,求出 \(k\) 颗生成树,使得从 \(1\) 到它们的距离跟原图上一样。

\(n,m\leq 2\times 10^5\)\(k\times m \leq 10^6\)

题解:

对于每个 \(dis=x>0\) 的点,选出恰好一条边,连 \(dis=x-1\) 的点即可。

证:

首先对于每个 \(dis=x>0\) 的点,必能选出一条边使得那个点 \(dis=x-1\) ,否则原图上最短路不是 \(x\)

其次这样选一定是一棵树,因为有 \(n-1\) 条边且不可能出现环。

然后不存在一条边连的两个点 \(dis\) 相等,否则要不然不连通要不然 \(dis\) 不合法。

所以说有且只有这种选法。(证明的好像不太严格)

\(O(n+m\times k)\)

Codeforces Round #496 (Div. 3)

标签:media   edit   表示   case   short   car   题意   生成   进制   

原文地址:https://www.cnblogs.com/wangziji/p/13649246.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!