4939: [Ynoi2016]掉进兔子洞
Description
您正在打galgame,然后突然发现您今天太颓了,于是想写个数据结构题练练手:
一个长为 n 的序列 a。
有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立。
注意这里删掉指的是一个一个删,不是把等于这个值的数直接删完,
比如三个区间是 [1,2,2,3,3,3,3] , [1,2,2,3,3,3,3] 与 [1,1,2,3,3],就一起扔掉了 1 个 1,1 个 2,2 个 3。
Input
第一行两个数表示 n , m。
第二行 n个数表示 a[i]。
之后 m 行,每行 6 个数 l1 , r1 , l2, r2 , l3 , r3 表示这三个区间。
Output
对于每个询问,输出一个数表示答案。
Sample Input
5 2
1 2 2 3 3
1 2 2 3 3 4
1 5 1 5 1 5
Sample Output
3
0
HINT
n , m <= 100000 , 1 <= a[i] <= 1000000000
显然是要求$\sum_{i=1}^{3}(r_i-l_i+1)-\sum_{i=1}^{Max}min(cnt_1[i],cnt_2[i],cnt_3[i])$,$cnt_j[i]表示数字i在区间j中出现次数$
考虑求后面的部分。首先肯定要离散化。
可以将每个询问拆成三个,分别处理出每个区间的$cnt$数组。而$cnt$数组可以用莫队来得到。
现在考虑如何较快的将三个$cnt$取最小后求和。这个可以用$bitset$来做到。
考虑离散化的时候,比如样例1 2 2 3 3,离散化后得到1 2 2 4 4,那么在$bitset$中,就可以用第3个bit位来表示第二个出现的2,用第2个bit位来表示第一个出现的2。然后只需要把三个bitset与起来就得到答案了。
代码:
1 |
|