Codeforces Round #740 部分题解

比赛链接另一个比赛链接

题目评分:

  • Div.1:1300-1900-2000-2600-3000-3300
  • Div.2:800-1300-1300-(1700-1900)-2000-2600

Div.2 D/Div.1 B Up the Strip

Solution 设 $f_i$ 表示从 $n$ 到 $i$ 的方案总数。

使用减法转移的话,也就是 \(f_i=f_i+\sum_{j=i+1}^n f_j\)

而使用除法,考虑填表法,考虑一个除数 \(d\),那么能够被影响的是 \([di,di+d-1]\) 这样一个区间。

发现这两个东西都可以后缀和优化,所以减法转移可以做到 \(O(1)\),而除法呢,容易发现这是个调和级数 \(O(\log n)\) 的。

Div.2 E/Div.1 C Bottom-Tier Reversals

Solution 强构造,不过我是傻逼没想到突破口。

先考虑判无解,容易发现翻转不改变某个数所在位置的奇偶性,可以直接判无解。

操作步数为 \(\frac 5 2n\),这启示我们,对于每一个数对 \((i,i+1)\),使用 \(5\) 次操作把他丢到对应的位置。

比如序列 \(1,6,4,5,3,7,2\),我们想要将 \(6,7\) 放到最后,考虑如下方案:

  • 操作奇数所在的位置,即 \(6\),序列变为 \(\color{red}{7}\color{black},3,5,4,\color{red}{6}\color{black},1,2\)
  • 操作偶数所在位置的前一位,即 \(4\),序列变为 \(\color{black}4,5,3,\color{red}7\color{black},\color{red}6\color{black},1,2\)
  • 操作偶数所在位置的下一个位置,即 \(6\),序列变为 \(\color{black}1,\color{red}6\color{black},\color{red}7\color{black},3,5,4,2\)
  • 操作奇数所在位置,即 \(3\),序列变为 \(\color{red}7\color{black},\color{red}6\color{black},1,3,5,4,2\)
  • 逆转整个序列,序列变为 \(\color{black}2,4,5,3,1,\color{red}6\color{black},\color{red}7\)

按照这个方式模拟整个过程即可,时间复杂度 \(O(n^2)\)

Div.2 F/Div.1 D Top-Notch Insertions

Solution 数据结构与组合的精妙结合。

发现最后的序列顺序是确定的,比如 \(a_1\le a_2\le a_3\),容易发现如果只有 \(\le\) 可以直接隔板出答案。

但是会有插入的情况,如果发生一次形如 \((x,y)\) 的插入,意味着 \(a_x<a_y\)

那么,依据隔板法,总的方案数为 \(\binom{2*n-1-c}{n}\),其中 \(c\) 表示 \(<\) 的个数。

考虑维护这个 \(<\),一个数前面是 \(<\),那么一定有数被插入到了前面,考虑维护一个集合 \(S\),初始时里面被放进了 \(1\sim n\)

倒序处理每一个插入,对当前插入,设排名为 \(y_i\) 的数为 \(p\),排名为 \(y_i+1\) 的数为 \(q\),删除 \(p\) 并为 \(q\) 打上标记,最后 \(c\) 即为打上标记的数的个数。

使用线段树上二分,时间复杂度 \(O(m\log n)\),注意别写成了 \(O(n\log n)\)

Div.1 E Down Below

Solution *3000 神题。

考虑二分答案转化成判定性问题,好了现在问题变成给定一个 \(x\),问能否走完。

如果没有第三个条件,直接贪心,爽哉,傻逼题!!!!1

完了,有了第三个条件怎么做,我只好自闭。

考虑我们现在已经走过的点集为 \(S\),考虑现在这些点中开始 BFS 找路,发现合法的路径要么是一个 \(\rho\) 形,要么是一个走出去再走回 \(S\),这两都可以在 BFS 中找出来。

那么,做 \(n\) 次 BFS,每次扩展 \(S\),在 \(S\) 大小为 \(n\) 时就发现有解。

每次 \(S\) 至少增加 \(1\),那么时间复杂度就是 \(O(n^2\log v)\) 的,实际上可能完全跑不满。

posted @ 2021-10-15 16:08  cnyz  阅读(42)  评论(0编辑  收藏  举报