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