牛客多校04L :Ladder Challenge
题目大意
给你 nnn 个数 a1,a2,...,ana_1,a_2,...,a_na1,a2,...,an,假如你有一个数 xxx 你可以对其进行以下的操作:选择一个最小的 iii 满足 ai>xa_i>xai>x,然后令 ai=ai−1,x=x+1a_i=a_i-1,x=x+1ai=ai−1,x=x+1
现在有 qqq 次询问,每次询问给你一个数 xxx 和一个目标排名 rankrankrank,请求出最小的操作次数满足 x≥arankx\ge a_{rank}x≥arank
思路
比赛的时候过完五题只剩下50min了,想了一个大概的思路冲了一发,但是没过,后面发现是有一个细节没考虑到。
我的切入角度是考虑 aaa 数组差分的变化(大概的变化),然后我发现最开始 xxx 的贡献会逐渐减半,因此到最后会变成0或者1(如果做题做的比较多的话会知道有一些情况可能会一直保持1)。
不过我一开始以为之和 xxx 的奇偶性有关,但是打了一个表发现这种做法是不对的。
无论是奇数还是偶数,在操作完大概 logA\log AlogA 次以后就会变成一样的。
然后我构造出了一种比较特殊的情况
10000 2
4 5 6 7 .... 10003
3 1
4 1
比如这一种,操作完以后前 n−1n-1n−1 个都是不变的,但是第 nnn 个就会相差 111
原因是每次操作完以后两次询问的 xxx 始终相差 111
因此我们可以先另 x=0x=0x=0,然后记录每次操作以后的数是什么
然后在求如果在某个位置当前的数比 x=0x=0x=0 到达的数多 111,那么最多会延伸到哪里
code