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}}\)

posted @ 2022-06-13 21:05  Samsara-soul  阅读(124)  评论(3编辑  收藏  举报