A
题意解析:给定一个长度为 nnn 的字符串 SSS。有 mmm 次操作,每次会往字符串最前面或最后面添加一个字符。请你输出最后的字符串。
显然双端队列 deque 可以完美解决这个问题。
时间复杂度:O(t×(n+m))O(t\times (n+m))O(t×(n+m))。
B
题意解析:给定一个正整数 nnn,求出所有的正整数 xxx,使得存在一个正整数 yyy 满足 yyy 为在 xxx 的十进制位末尾添加一些 000 得到的结果,且 x+y=nx+y=nx+y=n。
显然,yyy 一定为 10k×x10^k\times x10k×x,其中 kkk 为正整数。所以问题转化成了求出所有的 x,kx,kx,k,使得 (10k+1)×x=n(10^k+1)\times x=n(10k+1)×x=n。显然答案就位所有的正整数 x=n10k+1x=\frac{n}{10^k+1}x=10k+1n 。
时间复杂度:O(tlogn)O(t\log n)O(tlogn)。
C1
题意解析:
有一个潘子涵前来买瓜。
潘子涵:这瓜多少钱一斤?
卖家:我们这有很多种瓜,每种瓜都有 (105)3(10^5)^3(105)3 个,第 iii 种瓜质量 3i3^i3i 斤,售价 3i+1+i×3i−13^{i+1}+i\times 3^{i-1}3i+1+i×3i−1 元。
潘子涵:Whatsup,你这瓜皮子是瓜粒子做的还是金子是金子做的?
卖家:你要不要吧。
潘子涵:我刚刚 AK 了 IOI,不差钱。但是我有一个要求:
* 我恰好要买 nnn 斤瓜,多一斤少一斤都不行。
* 我希望我买的瓜的数量最小。
卖家:我不会啊,你自己挑吧。
潘子涵:我也不会啊。
卖家:你都 AK IOI 了你还不会?还有你这不是两个要求吗?
假如你是潘子涵,你会如何挑选?请你输出潘子涵所花费的最小金币数。
如果你不选择买第 iii 种瓜,就得买至少 3j3^j3j 个第 i−ji-ji−j 种瓜。显然这样是不优的。
所以我们有这样的贪心:如果能买大的瓜,就直接买。
预处理出 3i3^i3i 的值,就能直接过了。显然同一种瓜最多只能买 222 个,使用 while 也可以通过。
时间复杂度:O(tlogn)O(t\log n)O(tlogn)。
C2
题意解析:
有一个潘子涵前来买瓜。
卖家:怎么又是你?
潘子涵:那咋了。老规矩。
卖家:好的,来几斤?
潘子涵:nnn 斤……等等,我经过二分答案,发现我能提不超过 kkk 个瓜。所以你只要给我装不超过 kkk 个瓜就行了。如果不能装,给我 111 元。
卖家:尼姆(指一种博弈)。
假如你是卖家,请你算出他最少付的钱数。如果不能装,输出 -1。
首先按照上面的贪心,算出最少得瓜数。然后推式子,看看如果 111 个第 iii 种瓜被 333 个第 i−1i-1i−1 种瓜代替会产生什么样的结果:
3×(3i+(i−1)×3i−2)=3i+1+(i−1)×3i−13\times (3^i+(i-1)\times 3^{i-2})\\ = 3^{i+1}+(i-1)\times 3^{i-1} 3×(3i+(i−1)×3i−2)=3i+1+(i−1)×3i−1
我们发现,会少 3i−13^{i-1}3i−1 元钱。而这样会多买 222 个瓜。
所以我们先将 iii 较大的瓜代替,逐个计算。
时间复杂度:O(tlogn)O(t\log n)O(tlogn)。
D
题意解析:有一个无限长的数,它为所有正整数逐个拼接起来的结果。它张这个样子:1234567891011121314151617181920...1234567891011121314151617181920...1234567891011121314151617181920...。求这个总左往右数前 nnn 位的和。
绝世糖题。二分出前 nnn 位是由多少个自然数拼接而来的(再加下一个自然数的一部分),然后拿个数位 DP 的板子就秒了。
时间复杂度:O(tlog2n)O(t\log^2 n)O(tlog2n)。
E
题意解析:给定两个长度分别为 n,mn,mn,m 的数组 A,BA,BA,B,你需要回答 qqq 次询问,每次询问给出三个数 x,y,z(z≤x+y)x,y,z(z\le x+y)x,y,z(z≤x+y),你需要在 A,BA,BA,B 分别选择最多 x,yx,yx,y 个数,并且选的数总数量必须为 zzz。求你选的这些数的和的最大值。
首先肯定得排序,因为每次选肯定得选最大的。然后再做一个前缀和,方便求 [1,k][1,k][1,k] 的区间的和。
此时这两个数组有了一个性质:均为单调递增,但是它们的增量单调不增。
我们需要发挥我们惊人的注意力,发现:当 AAA 数组选的数的数量越来越大时,选数的和会先上升后下降!
证明:
假设选了 AAA 数组前 iii 个数。则我们就得选 BBB 数组前 z−iz-iz−i 个数。
由于两个数组增量单调不增,所以 iii 越大,AAA 数组选的数的和的增加量越来越小,而 BBB 数组的减小量却越来越大!当这两个值的差大于 000 时,和上升;等于 000 时,和不变;小于 000 时,和下降。
所以我们只需要求这个单峰函数的最大值就行了。显然可以三分。
时间复杂度:O(nlogn+mlogm+qlog(n+m))O(n\log n+m\log m+q\log (n+m))O(nlogn+mlogm+qlog(n+m))。