【A】构造(待完坑)
看到排序考虑构造出 \(\texttt{swap}\) 函数。
如果存在 \(a_i+a_j=K\),如果我们想要 \(\texttt{swap}(i,k)\):让 \(a_i\) 等于 \(a_k\),然后让 \(a_k\) 等于最初的 \(a_i\),就完成了交换。
但是这种方法存在局限性。我们考虑另外一种做法:
- 首先将一堆 \(a_i+a_j=K\) 的 \(a_i,a_j\) 分别交换到 \(a_1,a_n\)。然后令 \(a_1\leftarrow 0,a_n\leftarrow K\)。
- 然后对于中间部分的 \(a_i=0\),可以与 \(a_n\) 匹配,然后交换到前面。\(a_1\) 与 \(a_i=K\) 匹配,同理。
- 令最后一个被加入的 \(0\) 变成 \(1\),最后一个被加入的 \(K\) 变成 \(K-1\),从步骤一开始继续操作。
我们相当于在排序一个前缀和后缀。
无解即为:序列无序且不存在 \(a_i+a_j=K\)。
显然这个填颜色是要求划分为两条链。
使用两个栈分别存储白链和黑链,从小到大加入每个节点。不妨令白栈栈顶为 \(w\),黑栈栈顶为 \(b\)。
查询当前加入的节点 \(i\) 与两个栈顶的关系:
- \(w\rightarrow i,b\rightarrow i\)。
- \(w\rightarrow i,b\not \rightarrow i\)。
- \(w\not \rightarrow i,b\rightarrow i\)。
由于最大反链个数小于等于 2,所以不会有两个栈顶都到达不了的情况。
对于后两种情况,直接加入对应的栈。对于第一种情况,发现我们决策不了。引入新的栈,用来储存这类点。不妨设其栈顶为 \(t\)。
那么以后加入 \(i\),只需要询问 \(t\) 和 \(i\) 的关系即可,如果 \(t\rightarrow i\),那么加入 \(i\) 到待定栈。
否则,我们查询 \(w,b\) 与 \(i\) 的关系,然后将 \(i\) 加入对应的栈,待定栈的点全部加入另外一个栈。
每个节点的查询个数不超过 2,总查询次数不超过 \(2n\)。
Keep the Sum
Tensor
Funny or Scary?
Grid Reset
Choose Your Queries
Make Triangle
Game Bundles
Wonderful Guessing Game
浙公网安备 33010602011771号