敢想不敢写,只会坑队友 = =
1002 three arrays
题意
给出两个长度为 n ( n ≤ 1 0 5 ) n(n\le 10^5) n(n≤105)的数列,两个数列均可以被任意排列,排列后数组两两作异或,得到的新的数列字典序最小。
题解
对于一个指定的数字来说,通过字典树,可在另一数列中唯一确定一个异或和最小的数字,如果来自两个不同数列的数字互相为最小异或和,那么它们一定是最终答案中的一个组合。
官方题解中给出的题解中提到,若B是A的最小异或对象,可以从A向B连一条边,若B连边对象为C,则说明A->B这条边产生的异或值大于B-C这条边产生的异或值,否则,B会连向A。由此可以得出,这张图上不会出现点数大于2的环。
那么可以开一个堆栈,栈为空,则向栈内放入任意一个未匹配数字。栈非空,则为栈顶元素找到一个最小异或目标,这个目标如果不在栈内,则把这个元素也入栈,如果在栈内,则一定在栈顶元素的下面(互为最小异或对象),此时把两个元素配对出栈。
对于一个元素来说,它只有入栈出栈两个操作,一次字典树的查询是
O
(
l
o
g
n
)
O(logn)
O(logn)的,所以总复杂度是
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
然而lml还有更加优秀的做法,对A字典树和B字典树同时向下搜索,尽量走相同方向的边,这样搜到的一对数字一定是互相为最小异或对象的。这种方法比官方题解要好写不少。
1004 equation
题意
给出
n
(
n
≤
1
0
5
)
n(n\le 10^5)
n(n≤105)对
a
i
,
b
i
(
1
≤
a
i
≤
1000
,
−
1000
≤
b
i
≤
1000
)
a_i,\ b_i(1\le a_i\le 1000, -1000\le b_i\le 1000)
ai, bi(1≤ai≤1000,−1000≤bi≤1000) ,以及整数
C
(
1
≤
C
≤
1
0
9
)
C(1\le C\le 10^9)
C(1≤C≤109)。
求出所有满足
∑
i
=
1
n
∣
a
i
⋅
x
+
b
i
∣
=
C
\sum_{i=1}^n|a_i\cdot x+b_i|=C
∑i=1n∣ai⋅x+bi∣=C的解
x
x
x。无穷解输出
−
1
-1
−1,以分数形式输出。
题解
可以根据这 n n n个式子将有理数域划分出 n + 1 n+1 n+1个区间,每个区间内的求解的方程是确定的,不带绝对值的,可以直接求解。若一次项的系数为 0 0 0,且常数项也为 0 0 0,则说明存在无限多的解。
1005 permutation 1
题意
给出一个整数
N
(
N
≤
20
)
N(N\le20)
N(N≤20),对于一个
N
N
N的排列
p
1
,
p
2
,
…
p
n
p_1,\ p_2,\ \dots\ p_n
p1, p2, … pn,可以构造出一个长度为
N
−
1
N-1
N−1的数列
a
i
=
p
i
+
1
−
p
i
a_i=p_{i+1}-p_i
ai=pi+1−pi。
求出
N
N
N的所有排列中,生成的
a
i
a_i
ai数列的字典序第
K
(
K
≤
1
0
4
)
K(K\le 10^4)
K(K≤104)大的排列是多少。
题解
由于
K
K
K不大,最多涉及到
8
8
8的全排列,全部求出后排序即可,
N
>
8
N>8
N>8时简单构造前面的几项,最后
8
8
8项利用
8
8
8的全排列结果即可。
官方标解适用于
K
K
K更大时的结果,日后再说。
1006 string matching
题意
题目中给出了一个暴力匹配来求一个长度
≤
1
0
6
\le10^6
≤106的字符串中,第
i
i
i 位的后缀与原串的最长公共前缀的长度。
要求输出这个暴力匹配匹配的次数。
题解
EXKMP即可 O ( n ) O(n) O(n)求解,注意处理最长公共前缀长度即为后缀长度时的匹配次数。
1007 permutation 2
题意
给出一个整数 N ( N ≤ 1 0 5 ) N(N\le 10^5) N(N≤105),要求在数轴上从 x x x 出发,终点为 y ( 1 ≤ x < y ≤ N ) y\ (1\le x<y\le N) y (1≤x<y≤N) ,不重复地遍历 1 − N 1-N 1−N的每一个点,要求每次移动的距离不能超过 2 2 2,求合法的遍历方案数量。
题解
显然地,首先要把 x x x 左边的遍历后,再遍历 x , y x, y x,y之间的点,最后再遍历 y y y右边的点,遍历两边的点的方案是固定唯一的,如下。只有从 x + 1 x+1 x+1到 y − 1 y-1 y−1这一段是我们要求的方案数,然而这段的遍历也只有两种方案,不难得到递推式 f ( n ) = f ( n − 3 ) + f ( n − 1 ) f(n)=f(n-3)+f(n-1) f(n)=f(n−3)+f(n−1),直接递推求解即可。
补题
- 1002
- 1004
- 1005
- 1006
- 1007
看题
1001
1003
1008
1009
1010