学校 3.15
开始写这篇记录的时候是 3 月 12 日,我们学校不知道是诺如还是什么反正停课上网课了,不过对我来说没啥差别只是在机房换到了在家,依旧是机房孤寡选手。
QOJ1171 Integer Array Shuffle
有一个数组 \(A\),一次操作定义如下:
取一个空数组 \(B\),每次将 \(A\) 的左或右端移除一个元素并插入到 \(B\) 末端,\(A\) 为空时用 \(B\) 替换 \(A\)。
给定长为 \(n\) 的数组 \(A\),求将 \(A\) 排序所需要的最小操作数。
\(n\le 3\times 10^5\)
相邻的相等元素可以忽略,把序列划分成递增子段和递减子段,分别标成 0,1,于是得到了一个 01 串。而考虑每次合并头尾两个字符,如果都是 0 或者都是 1,那么可以归并成开头的一个 0 或 1。如果一个 0 一个 1,那么去掉开头的第一个字符,剩下的就是一个 01 交替的回文串。因此每次操作都可以把 01 串的长度减半。所以只需要统计原来 01 串的长度即可,复杂度线性。
QOJ4996 Icy Itinerary
有一张 \(n\) 个点 \(m\) 条边的图,求是否有一个排列 \(a_n\) 满足至多有 \(1\) 个 \(2\le i< n\) 满足边 \((a_{i-1},a_i)\) 与边 \((a_{i},a_{i+1})\) 中有且仅有一条存在。
\(n,m\le 3\times 10^5\)
考虑初始的链为 \(\{ 1\}\),每次加入一个点 \(u\),当前满足条件的分界点为 \(i\)。不妨设存在边 \((a_{i-1},a_{i})\),如果存在边 \((u,a_i)\) 则把 \(u\) 插入到 \(a_i\) 和 \(a_{i+1}\) 中间,如果没有则插入到 \(a_{i-1}\) 和 \(a_i\) 中间,显然链还是合法的,按照这个方式构造即可。
QOJ5096 千百
很牛的题!!但是咕了。
QOJ5568 Cyclic Shifts
给定一个长度为 \(n\) 的排列 \(p\),每次操作可以选择一个 \(0<k\le n\) 并选择 \(k\) 个元素 \(p_{x_1},\cdots,p_{x_k}\),将这些元素向右循环移位一格,代价为 \(\frac{1}{k}\)。
要求在 \(2\) 的代价内给数组排序。
\(n\le 5000\)
取 \(n-1\) 个数循环移位相当于将没取的那个数左移一位,由此可以在一次操作中将不相邻的数各自向左移位,代价不超过 \(\frac{2}{n}\)。这样的操作最多进行 \(n\) 次,而且肯定有无法用满 \(\frac{2}{n}\) 代价的时候,于是可以在 \(2\) 的价值内将数组排序。
QOJ5095 九王唱
和千百一样牛,一样咕。
P4557 战争
闵可夫斯基和,做过的题,不是很想写题解啊,那就不写了。
P10630 [JOI Open 2017] 推土机 / Bulldozer
CF1359F RC Kaboom Show
发现只要有两条线不平行就一定有解,可以判掉无解。
考虑二分答案,现在有一个时间 \(t\),求是否可以在 \(t\) 时刻内让两辆车相撞。发现这个问题等价于画出所有小车在 \(t\) 秒内经过的线段,求是否有交点。
考虑如何判断线段之间有交点。使用扫描线,按 \(x\) 从小到大扫,每个线段拆成插入和删除。每次扫到一个 \(x=x_0\) 时,将所有线段按照与 \(x=x_0\) 交点的纵坐标排序,每次加入一条线段时,找到上下与其相邻的两条线段,判断加入的线段和这两个有没有交。删除同理,找到相邻的线段,画图可以证明正确性。
初始二分上下界为 \(0\) 和 \(10^{12}\),二分 \(70\) 次就够了。

浙公网安备 33010602011771号