洛谷2025省选测试D1T2“羽毛” 题解
洛谷2025省选测试D1 T2“羽毛” 题解


快进到:本题可以转化为,每次询问给定 \(l,r\) 求:
赛场思路:“一个位置 p 加上 1 后,根据前缀和,p~n 的所有位置加1,假设上一次答案为q
那么新的答案必定在 \([max(p,q+1),n]\)  中产生。
而这些数在之前都没有超过0,若有新的答案,其必定是区间最大值。
于是维护区间最大值可以解决 。对于在 p 位置上减 1,那么 \(q\in [p,n]\) 可能让 q 不为答案,这时可能有正数减为0,但原本是有负数的所以做不了
即:可以插入,不能删除,可以回滚莫队,复杂度$O(n\sqrt q\log n) $”
然而常数太大,没暴力快。
设 \(F([l,r],x)=\sum_{i=0}^x(\sum_{j=l}^r[a_j=i]-1)\),由于考场上我认为 \(F([l,r],x)\) 不单调所以不能二分,每次重新找位置是 \(\mathcal O(n)\),才用回滚莫队,但实际不是。
如果在值域线段树上维护区间 \(F([l,r],x)\) 最值,每次左右递归的时候看右区间的 \(mx\) 是否大于 \(0\) 即可。
即使域不单调,也可以线段树上二分求解想要的信息,因为它维护区间信息,而不是单点求值。
那么就没必要用回滚莫队,常数大大减小。
出题人说可以做到 \(\mathcal O(n\sqrt n)\) 但我不会。
可以看出来这道题离线不带修就是让你扫描线的。但扫 \(l,r\) 都很难做
答案很小的时候,可以直接对答案域进行扫描线,转而同时维护所有询问的信息。
\(ans=n\to 1\) ,设此时 \(ans=x\),若 \(F([l_i,r_i],x)=x+1\),则马上确定 \(ans_i=x\),不再考虑 \(qry_i\)。
现在 \(ans:x\to x-1\),即要删去 \(x\) 的贡献,令 \(a_i=x\) 则 \(\forall i\in [l_i.r_i],F([l_i,r_i])\) 自减 \(1\)。
然后就发现做不了,因为这关心两维限制,而我们不能再扫描线降维了。
同时关心多个区间,可以考虑排除包含的情况,简化问题。
发现若 \([l_j,r_j]\subseteq [l_i,r_i]\) 即区间包含,则 \(ans_j\le ans_i\),当没有确定 \(ans_i\) 时,\(ans_j\) 一定不会被确定,此时没必要考虑。
于是被考虑的区间不包含。
对于不相互包含的区间,排序后,包含位置 \(i\) 的区间,一定连续。
那么我们就可以用线段树或平衡树维护,复杂度 \(\mathcal O((n+q)\log n)\)。
如何找到应该被插入的区间?
我们将区间排序后,建立一个线段树维护 \(max_{i\in [L,R]}r_i\)。这样当一个区间 \([l_i,r_i]\) 被删除时,找到上一个正被考虑的区间 \(lst\) ,下一个正被考虑的区间 \(nxt\) 那么对于所有 \(lst<i<nxt,r_i>r_{lst}\) 且没有被考虑过的 \(i\) 应该被插入,这就不断找变成查询区间中第一个满足 \(r_i>r_{lst}\) 的 \(i\),可以线段树上二分解决。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号