2019 Multi-University Training Contest 5

敢想不敢写,只会坑队友 = =

1002 three arrays

题意

给出两个长度为 n ( n ≤ 1 0 5 ) n(n\le 10^5) n(n105)的数列,两个数列均可以被任意排列,排列后数组两两作异或,得到的新的数列字典序最小。

题解

对于一个指定的数字来说,通过字典树,可在另一数列中唯一确定一个异或和最小的数字,如果来自两个不同数列的数字互相为最小异或和,那么它们一定是最终答案中的一个组合。
官方题解中给出的题解中提到,若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(n105) 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(1ai1000,1000bi1000) ,以及整数 C ( 1 ≤ C ≤ 1 0 9 ) C(1\le C\le 10^9) C(1C109)
求出所有满足 ∑ i = 1 n ∣ a i ⋅ x + b i ∣ = C \sum_{i=1}^n|a_i\cdot x+b_i|=C i=1naix+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(N20),对于一个 N N N的排列 p 1 ,   p 2 ,   …   p n p_1,\ p_2,\ \dots\ p_n p1, p2,  pn,可以构造出一个长度为 N − 1 N-1 N1的数列 a i = p i + 1 − p i a_i=p_{i+1}-p_i ai=pi+1pi
求出 N N N的所有排列中,生成的 a i a_i ai数列的字典序第 K ( K ≤ 1 0 4 ) K(K\le 10^4) K(K104)大的排列是多少。

题解

由于 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(N105),要求在数轴上从 x x x 出发,终点为 y   ( 1 ≤ x &lt; y ≤ N ) y\ (1\le x&lt;y\le N) y (1x<yN) ,不重复地遍历 1 − N 1-N 1N的每一个点,要求每次移动的距离不能超过 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 y1这一段是我们要求的方案数,然而这段的遍历也只有两种方案,不难得到递推式 f ( n ) = f ( n − 3 ) + f ( n − 1 ) f(n)=f(n-3)+f(n-1) f(n)=f(n3)+f(n1),直接递推求解即可。

补题

  • 1002
  • 1004
  • 1005
  • 1006
  • 1007

看题

1001
1003
1008
1009
1010

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值