Luogu4692 [Ynoi2016] 谁的梦
题意:定义一个序列的权值为不同数字的个数。
给出
求所有选法得到的序列的权值总和。如果一个序列能通过多种方法被选择出来,要计算多次。
需要支持单点修改。答案对
允许离线,
简单题。
将所有作为值的数字离散化。
不考虑修改
记不同的数的总数为
正难则反,对于每个数
总选法是
对于序列
则答案为:
注意到当
记
逐个考虑
考虑修改
我们单点修改序列
我们需要支持:插入,删除,计算不包含关键位置的数的个数。
注意到答案与极长不含关键点连续段有关,用 std::set
维护即可。
为了方便,可以将 set
了。
对于那些不等于 std::map
维护。
注意可能有某个
复杂度