A
开个 map
记录一下。
时间复杂度 (Oleft(1 ight))。
B
根据我们的常识,在正整数范围内,除了以下几个特例,其它情况都是指数较大值较大。
- (2^4=4^2)。
- (1^x<x^1left(x>1 ight))。
- (2^3<3^2)。
然后就做完了,时间复杂度 (Oleft(1 ight))。
C
树状数组裸题,枚举中间点。
如果拓展到四个或更多位置的话用个 DP (f_i,j) 表示第 (i) 个位置强制,目前选了 (j) 个位置的最小值。然后用树状数组同样维护 (j-1) 的情况就好了。
时间复杂度 (Oleft(nlog n ight))。
D
发现 (k) 很小,考虑从它入手。
以每种商品作为起点 BFS(注意可能有多个起点),这样就能算出每个点到每种商品的最短距离。
然后对于每个点取出最近的 (s) 种货物就好了,时间复杂度 (Oleft(km+nslog s ight))。
E
策神的题的弱化版。
交换显然会更改逆序对个数的奇偶性,但可不可以做到线性呢?
首先题目中进行的操作次数都是 (Oleft(n ight)) 级别的(虽然没什么用),这启发我们可以模拟交换的过程。
我们枚举每一个 (i),如果 (a_i ot=i) 就交换 (a_{a_i}) 和 (a_i)。
直接理解起来可能会有一点点抽象,画个图来看看。
因为是个排列,所以 (i) 向 (a_i) 连边会形成一个个有向环。
每次交换我们都会使得 (a_{a_i}=a_i),此后 (a_i) 位置不会再进行交换。
因为一共有 (n) 个数,所以最多交换 (n) 次。
时间复杂度 (Oleft(n ight))。
F
虽然边数很多(同枚举子集的 (3^n) 级别),但我们并不关注具体的连边情况,我们只关心连通问题。
考虑建立 (2^n) 个辅助点,向它们子集中 (1) 个数恰好少 (1) 的点连边。
比如说 ( exttt{1101}) 就向 ( exttt{0101 1001 1100}) 连边。
当然给定的 (m) 个点都要向 (left(2^n-1 ight)oplus a_i) 连边。
然后这个连通性又比较优美,每次 dfs 下去肯定能遍历到整个连通块。
所以访问过的点就不用访问了,总时间复杂度 (Oleft(2^n imes n ight))。
本质是通过分层的方式在保证连通的情况下缩减了多余的边数。