【学习笔记】CF930E Coins Exhibition
感觉最近总是没想好就开始写代码,还是太着急了。
感觉像是之前做过的题的加强版😅
考虑容斥哪些区间不合法。直接处理比较困难,考虑将所有区间按右端点排序,并将端点离散化(将右端点$+1$,转化为左闭右开区间),设$dp_{i,j,k}$表示只考虑前$i$个区间,以及$[1,j)$这段前缀,上一个选择的区间类型是$k\in [0,1]$时的答案。转移如下:
- $dp_{i,j,k}\gets dp_{i-1,j,k}$
- $dp_{i,j,k'}\gets -dp_{i-1,l_i,k}\times \frac{1}{2^{r_i-l_i}}$,条件:$r_i\le j$,可以是相同类型的区间也可以是不同类型的区间
- $dp_{i,j,k}\gets -dp_{i-1,j,k}$,条件:$l_i\ge j$,且必须是相同类型区间
- $dp_{i,j,k}\gets -dp_{i-1,l_i,k}\times \frac{1}{2^{j-l_i}}$,条件:$l_i\lt j\lt r_i$,且必须是相同类型区间
最后答案要乘上$2^K$。
显然,这些操作都可以用线段树去维护。
有没有更好的方法?
注意到,第三种转移加上第一种转移是将$\le l_i$的$DP$值推平成$0$,那么我们维护一个指针$p$表示$[1,p]$这段前缀的$DP$值都是$0$,如果$l_i\le p$那么什么都不做;否则我们暴力将指针移动到$l_i$,然后根据转移的范围在差分数组上打标记即可。
复杂度$O(n\log n)$。
$\text{remark}$ 我低估了这道题的思维难度。。。(主要是后半部分)1 |
|
【学习笔记】CF930E Coins Exhibition