CF905.Div3/Div2


CF905.Div3

CF905.Div2

Div3


A

模拟。

直接按顺序来按即可,答案即为每个数字的位置之差加 $4$ 。


B

回文串,所以有两种情况,一种是所有字母的个数都是偶数,另一种是一种字母个数是奇数,其余字母个数都是偶数。

所以只需要统计字母输出出现的次数,若出现奇数次数的字母有 $x$ 种,当 $k>x$ 时直接一定能构成回文串,否则当 $k=x$ 或 $x-k=1$ 时一定能构成回文串,否则就不能构成回文串。


C

发现 $k$ 相当小,只有 $2,3,4,5$ 。

当为 $2,3,5$ 时,由于是质数,所以只需遍历每个数取最小的加到 $k$ 的倍数的步数即可。

为 $4$ 时,有两种情况,一种是 $2\times 2$ ,另一种是 $4$ ,统计数中偶数的个数以及 $4$ 的倍数的个数来判断即可。


D

写了两个权值线段树。

一个维护左端点,另一个维护右端点。

然后对于每次询问,查找右端点线段树中最左边的位置 $pos$ ,然后查找一下左端点线段树在 $pos\sim m$ 内有没有值即可。

时间复杂度 $O(q\log q)$ ,需要离散化。


E

常规做法是从 $a_2$ 开始,一直乘 $2$ 直到大于等于其前一个数,往后的每个数都这么做。

这么做显然会超时。

考虑再维护一个 $b$ 数组,$b_i$ 表示 $a_i$ 乘了 $2^{b_i}$ 。

如果 $a_i < a_{i-1}$ ,那么 $b_i=b_{i-1}+\lfloor\log_2\lceil \frac{a_{i-1}}{a_i}\rceil\rfloor$ 。

反之则 $b_i=\max(b_{i-1}-\lceil\log_2\lceil \frac{a_{i-1}}{a_i}\rceil\rceil+1,0)$ 。

可以用二分优化。由于二分范围很小,可以看成常数。时间复杂度 $O(n)$ 。

最后求出 $b$ 数组所有元素之和即可。


G1

由于 $m=1$ ,所以可以考虑直接模拟。

维护两个双端队列 $A$ 与 $B$ ,将 $a$ 与 $b$ 排好序后分别插入其内。

若 $A$ 的队尾大于 $B$ 的队尾,则 $A$ 的队尾必须要删除,此时也需要另外在 $B$ 中删除一个数,那么肯定删除的数越小越好,所以选择删除 $B$ 的队头。

若 $B$ 的队头小于等于 $A$ 的队头,那么 $B$ 的队头必须要删除,同样的想法,再把 $A$ 的队尾删除。

这样就预处理出来了两个初始的队列。

然后不断将两个队列的队尾比较,如果可以满足题目条件 $a_i<b_i$ ,就直接出队,反之则将答案加一,并删除 $A$ 的队头,$B$ 的队尾。

时间复杂度 $O(n)$ 。


F补

符合题意的区间的左端点一定是每个数出现的第一个位置 $Lpos$ ,右端点一定是每个数出现的最后一个位置 $Rpos$ 。

所以考虑建一个权值线段树,先把每个数出现的第一个位置加进去,然后对每个数出现的最后一个位置 $Rpos$ ,直接查找 $1\sim Rpos$ 之间有多少个 $Lpos$ 即可。时间复杂度 $O(n\log n)$ 。

或者之间前缀和, $O(n)$ 。


G2补

二分。

根据 G1 的思路,肯定优先删掉 $a$ 里面最大的, $b$ 里面最小的。

于是发现具有某种单调性,假设删掉了 $k$ 个数,那么也肯定是删掉 $a$ 前 $k$ 大,$b$ 里面前 $k$ 小,然后可以判断剩下的是否满足条件。

所以可以二分答案来求出 $a_1$ 确定的时候的答案。

由于只改变 $a_1$ ,对于 $a_1$ 只有删或不删两种情况,所以不管其值怎么变,答案也只有两种,并且一定是 $x,x,x,x,\dots ,x+1,x+1,\dots$ 的形式,这个分段点也可以用二分来求得。

时间复杂度 $O(n\log n\log m)$ 。


Div2

补E


补F

想到可以另开一个数组 $b$ 用来存与之前相比的增量。

当第一个不为零的 $b_i<0$ 时,说明当前的修改可以使字典序更优,那么就记录当前修改的操作序号并清空 $b$ 数组。

由于需要区间加,所以可以考虑用线段树来维护 $b$ 数组。

判断第一个不为 $0$ 可以用线段树维护区间最大值和最小值,然后二分来找这个位置。

第一次的时候清空 $b$ 数组的操作我用了一个区间覆盖的标记,但是 T 掉了。

后来想到,既然每个操作是区间加,那减回去即可。

于是这样可以得到一个 $O(n\log^2 n)$ 的算法,已经可以通过了。

又想到,这个位置可以直接线段树二分,而不是二分位置然后线段树查找,这样就 $O(n\log n)$ 了,快了 200 多 ms 。

因为一个 sb 错误(因为标记不会上传,所以建树时每个点的标记都要赋初值)调了很长时间 QAQ 。


文章作者: HoshiuZ
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 HoshiuZ !
  目录