Codeforces Round 1039(Div.2)总结
\(Codeforces\ Round\ 1039(Div.2)总结\&反思\)
1039Div.2
序列:2128
总结&订正
可能是时间的问题,心态一直不佳,导致没有发挥。应尽量避免类似问题。
\(A.\)\(\color{red}Recycling\ Center\)
大致思路:将垃圾袋可以不花费金币的最小次数记录并排序,按照升序处理。证明略。
\(B.\)\(\color{orange}Deque\ Process\)
从左向右遍历,显然的对于已经非法的 \(i\) ,记录 \(j+1\to i+3\) 的合法长度,统计合法段最大即可。
\(C.\)\(\color{yellow}Leftmost\ Below\)
考虑一个数组 \(A\) ,每次放一个数 \(k\) 使得 \(A\) 中第一个严格小于 \(k\) 的数加上 \(k\) 。最终使 \(A\) 数组变为 \(B\) 数组。
我们应从左向右按位处理。
显然的,我们在处理地 第 \(i\) 位的时候,当前的数是不能大于已处理好的数的(那会破坏之前的数列的结构)。
于是我们记录并维护一个阈值,为已处理好的数的最小值。我们新放置的数显然不能超过这个阈值。每新处理好一位数只需将阈值取为原值与这一位取 \(min\) 即可。
考虑对于一个已知的数 \(n\) 与一个阈值 \(k\) ,当 \(k\ge n\) 时,我们显然只需放置一次。当\(\frac{n-1}{2}\le k<n\)时可以通过两次放置来完成。
对于放三次以上的情况,我们假设放了 \(x\) 次,假设地 \(x-1\) 次放置结束后数的值为 \(S\) 我们下一次放置的数 \(A_x\) 应大于 \(S\) ,不然不发放置。但是我们每一次放置都应尽量接近 \(k\) (否则不是最优),不会大于 \(S\) ,不成立。
综上,按位遍历 \(i\) 对于每一位处理,如此位满足要求,更新 \(k\) 否则直接判断不成立。
\(D.\)\(\color{green}Sum\ of\ LDS\)
给定一个长度为 \(n(n\le 5e5)\) 的排列 \(A\) ,求 \(A\) 的所有子段的最长下降子序列长度之和。
考虑对于每一个子串,有左端为 \(l\) 有端为 \(r\) ,其值为 \(l\) 到 \(r\) 的最长不下降子序列长度。
记录 \(p_i\) 为以 \(A_i\) 结尾的最长不下降子序列的长度(以 \(A_l\) 开头)。则 \(p_i=max(p_j)+1\) ,( \(l\le j < i\) )。
那么子串 \((l,r)\) 的贡献就是 \(max(p_l,p_{l+1},...,p_j)\) 有注意到 \(p\) 显然是单调不降的,所以记录最大值即可。
最终的结果就是 \(\sum_{i=1}^n{\sum_{j=i}^n{p_j}}\) 记录优化 \(p\) 数组即为最终结果。
\(E1.\)\(\color{green}Submedians\ (Easy\ Version)\)
定义中位数为\(v_i\) ,是在 \(A\) 中有 \(\lceil \frac{n}{2} \rceil\) 个数大于 \(v_i\) ,且有 \(\lceil \frac{n}{2} \rceil\) 个数小于 \(v_i\) 。
取 \(A\) 中一个最大的 \(v_i\) 。
求一个长度 \(n\) 大于 \(k\) 的子序列 \(B\) 使 \(v_i\) 任为中位数。
显然的用一个二分查询来找到最大的 \(v_i\) 然后从两头跑一遍求最大范围即可。
时间 \(O(nlogn)\) 。
\(E2.\)\(\color{#9f00ff}Submedians\ (Easy\ Version)\)
将最大的 \(v_i\) 改成了所有 \(v_i\) 。
\(v\) 的范围显然在 \(E1\) 中已经有做法了。
通过分析,我们发现一个序列的所有中位数显然是连续的,即若 \(v_0<v<v_1\) ,有 \(v\) 也是可行的中位数。根据定义易知。
所以最终可以先跑一遍最大值与最小值并求出其范围,然后将最小值的范围向最大值的范围推进。(由于最小值和最大值中间的其他数显然在 \(A\) 中不存在,所以范围只有一个)。
时间任为\(O(nlogn)\) 。

浙公网安备 33010602011771号