Codeforces Round #496 (Div. 3)

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)\)

posted @ 2020-09-11 00:12  daduda  阅读(106)  评论(0)    收藏  举报