「JOI 2021 Final」地牢 3
「JOI 2021 Final」地牢 3
判定无解
无解即: \(\exists i\in[S,T-1],A_i>U\)
是一个简单的区间最值问题
\[\ \]
\(O(nm)\)
关于用单调队列之类的东西维护每个点权值的方法这里就不提了
形式化地,我们把一层层点放到数轴上,令 \(X_i=\sum_{j<i}A_j\)
在数轴上坐标每 \(+1\) 消耗一点能量,我们要从 \(X_S\) 走到 \(X_T\)
考虑每个点的情况,不妨看做是用 \(B_i\) 去覆盖 \((X_S,X_T]\) ,求最小权值
发现对于 \(B_i\) ,它能够合法覆盖的区间一定是 \((X_i,X_i+U]\)
暴力地,可以直接让 \(B_i\) 更新这段区间的最小权值,然后暴力求和
\[\ \]
进一步分析每个 \(B_i\) 覆盖的区间,可以发现是合法区间 \((X_i,X_i+U]\) 中的某一连续段 \((L_i,R_i]\)
而 \(L_i\) 取决于 \(B_i\) 前面第一个 \(B_{pre}<B_i\) , \(R_i\) 取决于后面第一个 \(B_{nxt}\leq B_i\)
关于 \(pre,nxt\) 的求解显然只是一个单调栈解决
得到 \((L_i,R_i]\) 简单的描述
\(L_i=\max\{X_i,X_{pre}+U\}\)
\(R_i=\min\{X_i+U,X_{nxt}\}\)
(ps:这样求得的 \(L_i\) 不一定 \(<R_i\) )
暴力枚举即可 \(O(n)\) 查询
\[ \ \]
\[ \ \]
\(T_i=n+1\)
从这里开始需要一些数据结构?
考虑倒着从 \(n\) 到 \(1\) 计算每一个 \(S_i\) 的答案
发现在刚插入 \(i\) 的时候, \(pre_i\) 还未出现,可以看做 \(-\infty\) , \(nxt_i\) 已经确定
当 \(pre_i\) 出现时可以重新进行一次插入
每次插入可以用三元组表示 \((i,pre,nxt)\) ,为了便于叙述这里 \(pre,nxt\) 直接是坐标
考虑对于 \(L_i,R_i\) 进行参数分离计算,首先要考虑何时满足 \(L_i<R_i\)
显然条件就是 \(nxt-pre>U\)
\(\displaystyle L_i=\max\{X_i,X_{pre}+U\}=X_{pre}+\max\{X_i-X_{pre},U\}\)
\(\displaystyle R_i=\min\{X_i+U,X_{nxt}\}=X_i+\min\{U,X_{nxt}-X_i\}\)
\(\displaystyle Answer=\sum_{nxt-pre>U} (R_i-L_i)\cdot B_i\)
离线询问,离散之后可以用树状数组维护上述式子,对于不合法部分不要加入即可
\[\ \]
\[ \ \]
\(O(n\log n)\)
上面已经能计算 \(T_i=n+1\) 的询问,考虑将 \(S,T\) 转化为 \(T_{i}=n+1\) 的问题
如果直接 \(S,T\) 相减显然不合法,不妨找到在 \((S,n+1)\) 的方案中,覆盖的 \(T\) 的点 \(T'\)
\((S,n+1)-(T',n+1)\) 会抵消掉在 \(S\) 的方案中 \(T\) 右边的部分,而 \((X_{T'},X_T]\) 显然仍然是由 \(B_{T'}\) 覆盖,补回来即可
由此完成分离操作,而根据上面区间覆盖的定义, \(T'\) 实际上就是 \((X_T-U,X_T]\) 中最小的 \(B_i\)
所有操作都可以 \(O(n\log n)\) 完成
1 |
|