给$n$个区间$[l_i,r_i]$。若选择区间$[l_i,r_i]$,区间上的值$+1$,问求使$[1,n]$点值为奇数的个数最大,最大个数是多少,$1$个点最多被覆盖$k$次。$(n\leq 10^5,l,r\leq 10^9,k\leq 8)$
这题关键点在$k$。显然$2^k*n$复杂度可以接受。由于$l,r$大,把一个点覆盖$k$次,转换为离散化,一个区间最多覆盖$k$次。
$dp[i][j]$表示到$[i]$这个区间,且区间的状态为$j=10101001$,二进制每一位表示他是否含有覆盖自己的区间中的第$k$个。
举个例子$[2,3)$,题目给出$[3,7),[1,5],[2,4),[2,6)…$如果选择$2,4$原区间,$j=101$
如何转移?
$seg[i]=[l[i],l[i+1]],len(seg)=li[i+1]-li[i]$
找到都覆盖$seg[i]$与$seg[i-1]$的原区间。若$dp[i-1][st1]$($st1$含有这些区间),就可以转移到$dp[i][st2]$($st2$也含有这些区间)。
过于唠口,所以借助$tmp[st]=max(tmp[st],dp[i-1][st1])(st1这个状态的区间里含有st)$,然后让其映射到$st2$上。
- $pre[]$存的是共有的原区间,再$seg[i-1]$所有覆盖它的第几位。
- $now[]$存的是共有的原区间,再$now[i-1]$所有覆盖它的第几位。
代码
1 |
|