[CSA35G][XSY3318]Counting Quests (DP)

XSY3318
CSA35G
对于一个询问区间的集合 S S S,求出每一个数被哪些区间覆盖了,记为 S i S_i Si
要能保证猜出选中数,当且仅当每个数的 S i S_i Si互不相同。
考虑求出不满足要求的集合 S S S的个数。

首先可以观察得到 S i S_i Si的一个性质:若 a < b < c < d a<b<c<d a<b<c<d S a = S c , S b = S d S_a=S_c,S_b=S_d Sa=Sc,Sb=Sd,则必有 S a = S b = S c = S d S_a=S_b=S_c=S_d Sa=Sb=Sc=Sd

证明:因为 S a = S c S_a=S_c Sa=Sc,所以如果一个区间覆盖了 a a a,一定也覆盖了 c c c,那么这个区间一定也覆盖了 b b b,又因为 S b = S d S_b=S_d Sb=Sd,所以该区间一定也覆盖了 d d d。同理可证覆盖了 b b b c c c d d d的区间一定也覆盖了其它三个数。

我们给每个数一个编号 a i a_i ai,满足当且仅当 S i S_i Si相同的数 a i a_i ai相同。

由刚才的性质我们知道,不同的 a a a值的排布 只可能是以下情况:
–x--xx–xy—y–yy–( x , y x,y x,y出现范围呈并列关系)
–x--y-yy-y-x-xx-----( x , y x,y x,y出现范围呈包含与被包含关系)
不可能是这种情况:
–xx-y-x-x-yyy-------( x , y x,y x,y出现范围呈相交关系)

所以可以把 构造形如 x–xy–yz–z 的序列 a a a 分解成 构造形如 x—x 的序列 a a a,构造形如 y–y 的序列 a a a,构造形如 z–z 的序列 a a a 三个子问题。

并且在构造形如 x—x 的序列 a a a时, — 不管怎么填,最后得到的方案都一定猜不出选中数。
y–y , z–z 同理。

形式化地,每次把 a a a中的第一个数 x x x放入 b b b的末尾,然后在 a a a中删掉最后一个 x x x前的所有数(包括最后一个 x x x)。
例如 a = [ 1 , 2 , 3 , 2 , 4 , 2 , 5 , 5 , 10 , 6 , 7 , 8 , 7 , 6 , 9 ] a=[1,2,3,2,4,2,5,5,10,6,7,8,7,6,9] a=[1,2,3,2,4,2,5,5,10,6,7,8,7,6,9]
此时 b = [ 1 , 2 , 5 , 10 , 6 , 9 ] b=[1,2,5,10,6,9] b=[1,2,5,10,6,9]
可以发现,只包含被删掉数的区间可有可无,但包含未被删掉数的区间一定要使未被删掉数的 a a a值互不相同,即这些包含未被删掉数的区间对应着一个长度为 ∣ b ∣ |b| b的序列的答案。
例如序列 b b b中一个包含1,2的区间,对应着序列 a a a中一个包含1,2,3,2,4,2的区间。

那么就可以DP了:
f i f_i fi i i i个数的答案, g i , j g_{i,j} gi,j i i i个数,处理之后之剩 j j j个数的答案。则有:

f i = 2 C i + 1 2 − ∑ j = 1 i − 1 f j g i , j f_i=2^{C_{i+1}^{2}}-\sum_{j=1}^{i-1}f_jg_{i,j} fi=2Ci+12j=1i1fjgi,j

g i , j = g i − 1 , j − 1 + ∑ k = 0 g i − k − 2 , j − 1 2 C k + 1 2 g_{i,j}=g_{i-1,j-1}+\sum_{k=0}g_{i-k-2,j-1}2^{C_{k+1}^{2}} gi,j=gi1,j1+k=0gik2,j12Ck+12

时间复杂度: O ( n 3 ) O(n^3) O(n3) O ( n 2 l o g n ) O(n^2logn) O(n2logn)

还可以用多项式优化,但我不会。

猜你喜欢

转载自blog.csdn.net/Emma2oo6/article/details/120523881
DP
DP?