QOJ1087
<h3 id="题目链接">题目链接</h3><hr>
<h3 id="题解">题解</h3>
<p>考虑按位思考。将其转换成 <span class="math inline">\(x_i=0,1\)</span> 的特殊性质,假设此时的二进制位为第 <span class="math inline">\(k\)</span> 为,那操作就相当于如果 <span class="math inline">\(x_i\&2^k=1\)</span> 那就等价于特殊性质 <span class="math inline">\(x_i=1\)</span>,反之为 <span class="math inline">\(0\)</span>。可以差分在 <span class="math inline">\(O(n^2)\)</span> 的时间复杂度内求出那些位置被覆盖了,即涂了 <span class="math inline">\(1\)</span>,得出 <span class="math inline">\(a\)</span> 数组(这时定义不合法限制为 <span class="math inline">\(x_i=0\)</span> 并且 <span class="math inline">\(\exists xiabiao,l_i \le xiabiao \le r_i\)</span> 且 <span class="math inline">\(a_{xiabiao}=1\)</span>,这个可以 <span class="math inline">\(O(m)\)</span> 结合 <span class="math inline">\(a\)</span> 数组的前缀和求出),同时也可以顺便求出那些位置只被涂了一次的点 <span class="math inline">\(1\)</span>,得出 <span class="math inline">\(b\)</span> 数和右端点向前走的组。然后考虑删除一个限制的印象:</p>
<ul>
<li>删掉 <span class="math inline">\(x_i=0\)</span> 的限制,那么对于 <span class="math inline">\(a\)</span> 数组不会有改变,如果不合法限制就只有他一个,那么就是对的,反之就是错的。<span class="math inline">\(O(1)\)</span> 可以求出。</li>
<li>删掉 <span class="math inline">\(x_i=1\)</span> 的限制,就会使 <span class="math inline">\(a\)</span> 数组中的一些 <span class="math inline">\(1\)</span> 变为 <span class="math inline">\(0\)</span>。这个时候 <span class="math inline">\(b\)</span> 数组就派上了用场,我们先通过 <span class="math inline">\(b\)</span> 数组求出对于每一个不合法限制的左端点向后走的第一个只被涂了一次的点和右端点向前走的第一个只被涂了一次的点的位置,再将所有不合法限制的左端点的值取 <span class="math inline">\(max\)</span>,记为 <span class="math inline">\(r\)</span>,所有不合法限制的右端点的值取 <span class="math inline">\(min\)</span>,记为 <span class="math inline">\(l\)</span>(这个可以 <span class="math inline">\(O(n+m)\)</span> 解决,而且 <span class="math inline">\(l\)</span> 和 <span class="math inline">\(r\)</span> 是不变的),这个时候就要分类讨论。<img src="https://img2024.cnblogs.com/blog/3631675/202508/3631675-20250828103945427-864560282.png" alt="" loading="lazy"><br>
如果是这样,黄线为只被涂了一次的点的位置,黑区间为不合法区间,蓝圈为 <span class="math inline">\(min\)</span>,红圈为 <span class="math inline">\(max\)</span>,棕区间为这个1限制, <span class="math inline">\(l\le r\)</span> 时,只要这个1限制包含了 <span class="math inline">\(l\)</span> 和 <span class="math inline">\(r\)</span>,那就可以,否则就不可以。<br>
<img src="https://img2024.cnblogs.com/blog/3631675/202508/3631675-20250828105207820-470497608.png" alt="无标题" loading="lazy"><br>
如果是这样,<span class="math inline">\(r< l\)</span> 时,1限制不包含了 <span class="math inline">\(l\)</span> 和 <span class="math inline">\(r\)</span>,但这个图明显可以,因为中间有一个只被涂了一次的点,那删除这个点明显可以使不合法限制变得合法,所以只需要判断这个1限制之间有没有只被涂了一次的点。</li>
</ul>
<p>这两个判断可以 <span class="math inline">\(O(m)\)</span> 得出</p>
<p>所以除去常数后,整个的复杂度就为 <span class="math inline">\(O((n+m)log V)\)</span></p><br><br>
来源:https://www.cnblogs.com/yurinaxu/p/19061559
頁:
[1]