Codeforces 1697F. Too Many Constraints (2800)
给定 \(n,m,k\),任务是构造出一个长度为 \(n\),值域为 \([1,k]\) 的单调不减数组 \(a\),满足给定的 \(m\) 条限制(分为 \(3\) 种):
\(\text{Type 1:}\) \(a_i\neq x\)。
\(\text{Type 2:}\) \(a_i+a_j\leq x\)。
\(\text{Type 3:}\) \(a_i+a_j\geq x\)。
\(1\le n,m\le 2\cdot 10^4,1\le k\le 10,2\le x\le 2\cdot k\)。
简单 \(\text{two-sat}\) 题。
数据范围中 \(k\le 10\),值域很小,考虑拆点。
考虑将数组中的每个数拆成 \(\le 1,\le 2,\ldots,\le k,>1,>2,\ldots,>k\)。
记 \((i,j,0)\) 为表示满足 \(a_i\le j\) 的点,\((i,j,1)\) 为表示满足 \(a_i> j\) 的点。
- 根据定义,若 \(a_i\le j\),则 \(a_i\le j+1\),所以增加限制 \((i,j,0)\&(i,j+1,0)\)。
- 根据定义,若 \(a_i> j\),则 \(a_i> j-1\),所以增加限制 \((i,j,1)\&(i,j-1,1)\)。
- 根据单调不减的条件,若 \(a_i>j\),则 \(a_{i+1}\ge a_i> j\),所以增加限制 \((i,j,1)\&(i+1,j,1)\)。
- 对于第一种限制,\(a_i\) 要么 \(\le x-1\),要么 \(>x\),所以增加限制 \((i,x-1,0)\&(i,x,1)\)。
- 对于第二种限制,若 \(a_i\le t\),则 \(a_j\le x-t\),所以枚举 \(t\),然后增加限制 \((i,t,0)\&(j,x-t,0)\)。
- 对于第三种限制,若 \(a_i> t\),则 \(a_j> x-t-2\),所以枚举 \(t\),然后增加限制 \((i,t,1)\&(j,x-t-2,1)\)。
最后跑一遍 \(\text{two-sat}\) 求出答案。
总时间复杂度 \(O(nk)\)。
双倍经验加强版题面 \(\color{gold}{\text{Topcoder SRM Div1, LV3 NeverAskHerAge}}\)。