CF1476F
感觉很水的一道 3000.
定义 \(f_i\) 表示前 \(i\) 个灯能照亮区间 \([1,f_i]\) 的地方,显然这个 \(f\) 是单调的。转移分两种情况:
-
若 \(i\) 是
L,那么找到最小的 \(x\) 使的 \(f_x \geq i-a_i-1\),\(f_i=\max(f_x,i-1,F(x+1,i-1))\),其中 \(F(l,r)\) 表示区间 \([l,r]\) 能照到的右端点的最大值,这个搞一个 $\rm st $ 表。最小的是对的原因是因为 \(l\) 越小,\(F(l+1,i-1)\) 越大。 -
若 \(i\) 是
R,那么找到最小的 \(x\) 使得 \(f_x \geq i\),\(f_i=\max(F(x+1,i),f_x)\),最小的是对的原因同上。
如果以上两种情况都找不到怎么办,那么最终答案一定和 \(i\) 的 L,R 无关,直接将 \(from_i=i-1\) 就行了。
因为是单调的,所以上面的找最小随便二分一下就行了。发现对于以上两种情况区间 \([x+1,i-1]\) 都是 R,所以记一下 \(from_i\) 表示是从哪里转移过来的,在记一下当前的 L,R,从 \(n\) 开始每次跳到 \(from_x\),将 \([from_x+1,x-1]\) 全都强制为 R。
完结撒花

浙公网安备 33010602011771号