Loading

CF Round #751

Div1.A

套路对每一位考虑,不难发现当前位要消掉,\(k\) 一定要是这个位 \(1\) 的个数的因数,所以对所有位的 \(1\) 的个数取 \(gcd\) 就好了,别忘了特判全 \(0\)

code

Div1.B

考虑贪心,发现对于当前深度 \(now\),我们能跳到的区间是 \([now-a_{now},now]\),我们肯定会跳这个区间内,实际深度最小(高)的点(实际深度定义为跳之后滑下来的深度)。

证明:

感性理解法:我们要跳的尽可能高以跳出井,所以我们要让能跳到的区间尽可能的大(左端点尽可能小),这样选到能跳出去的关键点的概率肯定是更大的。

反证法(算是?):不合法当且仅当有一个实际深度更大的点能经过若干次跳跃能跳到关键点并跳出去,那我选实际深度更小的也一定能选到这个关键点。

考虑怎么维护,我们发现对于一个深度 \(i\) 首先要满足 \(i+b_i\ge now-a_{now}\)\(i \ge now-a_{now}\)

考虑用主席树,所以我们对 \(i+b_i\) 建时间轴,每个结点维护当前区间内的实际深度最小值和在哪个点能取到这个值,对于叶子结点 \(l==r\),它的实际深度表示为 \(l+b_l-a_{l+b_l}\),即先滑再跳,能取到这个值的显然是 \(l\)

类似于传统主席树前缀和建树,我们对时间轴后缀和建树

查询就是找大于等于 \(now-a_{now}\)\(i+b_i\) 这棵树上的区间 \([now-a_{now},now]\) 的实际深度最小值和取到这个值的 \(l\)

显然,每次的 \(l\) 就是我们的路径,对于下一个 \(now\),它等于 \(l+b_l\)

特别地,对于无解的判断就是下一个 \(now\) 和这个 \(now\) 的值相同,即原地不动没法跳了。

智商不够 Data structures 来凑

code

Div1.C

显然 \(b\) 数组要有序,逆序对数才会更少。

对于一个 \(v \in b\),我们考虑计算每一个 \(a\) 的位置对它的贡献(会产生的逆序对个数),然后选一个贡献最小的位置插入就好了。

对于小于 \(v\)\(a_x\)\([1,x-1]\) 的贡献都要 \(+1\)

对于大于 \(v\)\(a_x\)\([x+1,n]\) 的贡献都要 \(+1\)

扫一遍所有 \(b\) 的取值,用线段树维护这个贡献即可

code

posted @ 2021-10-26 22:37  Quick_Kk  阅读(53)  评论(0)    收藏  举报