AtCoder Regular Contest 125 - ARC125

AtCoder Regular Contest 125

B - Squares

题意

给出一个 NN,求有多少对 (x,y)(x,y) 满足如下条件:

  • 1x,yN1\leqslant x, y\leqslant N

  • x2yx^2-y 是一个平方数。(规定 00 也是平方数)

答案对 998244353998244353 取模。

数据范围:N1012N\leqslant 10^12

思路

x2y=z2,(zZ0)x^2-y=z^2, (z\in \mathbb Z_{\geqslant 0}),则 y=x2z2=(xz)(x+z)y=x^2-z^2=(x-z)(x+z)

p=(xz),q=(x+z)p=(x-z), q=(x+z),则:

{1pqNpqp+q2=x[1,N]\begin{cases} 1\leqslant pq\leqslant N\\ p\geqslant q\\ \frac{p+q}{2}=x\in[1,N] \end{cases}

可以发现,qq 的取值一共只有 N\sqrt N 种。

对于每一个 qq 只用 O(1)O(1) 求出 pp 即可。

不难发现,pp 的取值只能为 q,q+2,q+4,,min(Nq,2Nq)q, q+2, q+4, \ldots, \min(\left\lfloor\frac{N}{q}\right\rfloor, 2N-q)

M=min(Nq,2Nq)M = \min(\left\lfloor\frac{N}{q}\right\rfloor, 2N-q),故一共有 Mq2+1\left\lfloor\frac{M-q}{2}\right\rfloor+1 种取值。

总复杂度 O(N)O(\sqrt N)

C - LIS to Original Sequence

题意

给出 N,KN,K 和一个长度为 KK 的序列 A=(A1,A2,,AK)A=(A_1,A_2,\cdots,A_K),求一个 1N1\ldots N 的排列,使得序列 AA 是该排列的一个最长上升子序列(LIS - longest increasing subsequence),并且要求排列的字典序最小

输入保证 AA 是一个严格单增序列。

数据范围:1KN2×1051\leqslant K\leqslant N\leqslant 2\times 10^5

思路

考虑如何通过 AA 来构造出一个排列 PP,用 PiP_i 代表排列 PP 中的第 ii 个元素:

首先,当 K=1K=1 时,Pi=(N,N1,N2,,1)P_i=(N, N-1, N-2, \cdots, 1)

其次,当 K2K\geqslant 2 时:

  1. 如果 A1=1A_1=1,那么一定有 P1=A1=1P_1=A_1=1,才能使得 PP 的字典序最小,且一定能满足要求。

  2. 如果 A12A_1\geqslant 2,那么一定有 P1=A1P_1=A_1,那么此时 PP 中的数字1还没有使用过,如果我们令 P2=1P_2=1 是不影响LIS的,因为题目只要求是LIS中一个即可,而且这样能使得字典序保持最小,所以有 P2=1P_2=1

    • 证明:P1=A1P_1=A_1。反设:若 P1<A1P_1 < A_1,那么最长上升子序列一定会比 AA 多出一个元素,不满足题意;若 P1>A1P_1 > A_1,则不满足字典序最小这个条件,综上,P1=A1P_1=A_1

上面都只考虑了 A1A_1,由于这个操作具有独立性,可以直接将 A1A_1 删去,考虑后面的元素,每个元素都按照上述方式加入排列 PP 中,只不过元素 11 的定义向右移了几位。

可以使用双指针模拟,ii 指向 AA 中元素,jj 指向 PP 中当前的 “1”(也就是当前能插入的最小的数字),保证不重复插入即可,如果枚举到了最后一个元素,按照 K=1K=1 的情况处理即可。

总复杂度 O(N)O(N)


AtCoder Regular Contest 125 - ARC125
https://wty-yy.github.io/posts/57678/
作者
wty
发布于
2021年8月23日
许可协议