菜成什么样了
2156 Div.2
D
压线过了。
考虑从低位到高位判定 0/1,每次 check 的数大约减半,那么 \(time=n+\frac{n}{2}+\frac{n}{4}+\dots=2n+\epsilon\),有 \(\epsilon\) 是因为可能上一步只删了下取整个。
剪枝是如果当前位置只剩 0 或 1 了就 skip。
E
二分答案 \(g\),设 \(f_{g}(i)=\sum_{j \ne i} [b_{\max(i, j}-b_{\min(i, j)}\ge g]\)。
假如 Alex 先手,那么只要有一个 \(f_{g}(i) \ge 2\) 那么他就一定能保证最终结果 \(\ge g\),因为 Alex 锁了 \(i\) 后再锁其中一个对应的数即可。
那么考虑 Hao 最开始要删谁,显然是删完它后剩下的所有 \(f<2\)。
暴力枚举第一个删的数,朴素做是查影响的所有数,直接写线段树能做,但发现我们只需要维护前后最近的各最多 3 个点即可,于是暴力 check 即可(set 维护 3 个值,每次超出时把最大的删掉)。
submission
F1&F2
操作简述:选择 \(3(12/21)\) 变成 \(1(23/32)\)
如果首项为奇数 \(a_1=2k+1\),则每次选 \(a_1, a_1-1, a_1-2 \to a_1-2, a_1, a_1+1\) (后面两个先后顺序不重要)
那么最后一定会变成 \(a_1=1\),之前所有 \(<a_1\) 的数 +1
若 \(a_{1}=2k\),注意到我们能类似把 \(a_1\) 变成 2。
考虑一个任意位置的奇数什么时候能变成 \(1\),显然是比它小的都在它右边,
考虑最靠左的满足条件的位置 \(p\),我们操作先使得 \(a_p=1\),然后把 \(a_1=2\)。
因为首位是 \(2\),所以 \(p\) 至少能被找到(即 \(a_p=1\) 算一个合法解)
这样最优的原因:考虑 \(1\le j<p\),由于 \(\forall a_{x}<a_p, x>p\),所以 \(a_j > a_p\),那么减小 \(a_p\) 的时候不会对 \([1, p)\) 产生任何影响
那么做完上述过程递归,将剩余部分变为 \(1-(n-1/n-2)\) 的排列继续操作,复杂度 \(O(n^2)\), link。
简化上述操作,就是相当于找第一个 \(2 \nmid a_{p}, \min_{1\le j \le p} a_j=a_p\) 的 \(p\),将其变为 1(首项为偶数时),其他的相当于按相对顺序赋值 2-n。然后把 \(1\) 删除,其余前移一位,等价于开始就把 \(p\) 删掉,所有 \(>a_p\) 的数全部 -1。
重新整理操作
- 找 \(p\)(若首项为奇数则直接跳过 12 到第三步)
- 删数 \(a_p\),并使所有 \(>a_p\) 的全部 -1。
- 删除首项,并使 \(>a_1\) 的数-1。
注意到 23 操作并没有影响相对大小,即不影响 1 操作。
维护 \(pos_i=k\) 表示 \(a_k=i\),找合法 \(p\),我们先满足 \(\min_{1\le j\le p} a_j=a_p \to \min_{1\le j< a_p} pos_j>p\),考虑第一步从首项开始找,即设 \(p_1=\min_{1\le j<a_1} pos_j\)(首先 \(pos_{(i, p_1)}\) 没有一个出现的比 \(p_1\) 早,\(pos_{(p_1, a_1)}\) 的不合法(因为比它们小的 \(p_1\) 在前面),故 \(p_1\) 是满足条件 \(\min_{1\le j\le p} a_j=a_p\) 的最小 \(p\)),若 \(a_{p_1}\) 此时为偶数,则找 \(p_2=\min_{1\le j<a_{p_1}} pos_j\)(显然 \(a_1>a_{p_1}>a_{p_2}\),所以 \(\min_{1\le j<a_{p_1}} pos_j\ge \min_{1\le j<a_{1}} pos_j\),即 \(a_{p_2}\ge a_{p_1}\))