CF1935E Distance Learning Courses in MAC
CF1935E Distance Learning Courses in MAC
题目大意
给定 \(n\) 个变量 \(z_i\in[x_i,y_i]\),你可以在范围内任意指定
\(z_i\) 的值。
\(q\) 次查询,每次查询给定区间 \([l_i,r_i]\),求用这些变量得到的
二进制或 最大值。
思路
选择 \(z\in[x,y]\),贡献分为两部分
- \([x,y]\)
的公共前缀,这一部分贡献恒定
- 在第一个不同的位置,\(y\) 一定为
\(1\),\(x\) 一定为 \(0\)
- 若要求贡献的这一位为 \(1\),那么可以给到一个 \(\leq y\) 的任意值。
- 否则,一定可以给到后面的所有位均为 \(1\)。
Solution1
查询时,先将所有恒定贡献求或
从高位开始查询所有位置,判断是否有 (2) 类贡献
若没有 (2) 类贡献,跳过
若有 2 个 (2) 类贡献,或这这一位已经为 1,则从这一位往后都直接给 1 (对应
(ii))
若只有一个,设为 \(y\),则依次考虑当前答案中为 \(0\) 的位,能给 1 就给 1 (对应 (i))。
1 |
|
Solution2
设两部分分别为 \(f,g=y\),考虑如何合并 (1) \(f\) 直接或合并 (2) \(g\) 在合并时,可以先做或,如果有重叠的位,将其中一个的这一位舍掉可以把下面的所有位都赋 1。
1 |
|