专栏文章

题解:CF2103F Maximize Nor

CF2103F题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miphh15v
此快照首次捕获于
2025/12/03 12:04
3 个月前
此快照最后确认于
2025/12/03 12:04
3 个月前
查看原文
首先考虑只有 0011 怎么做,此时答案变成判断是否存在一个包含 ii 的区间权值为 11
注意到对于任意 xxnor(x,1)=0,nor(x,0)=xxor1\operatorname{nor} (x,1)=0,\operatorname{nor}(x,0)=x\,\operatorname{xor} \, 1。那么容易注意到如下结论:
  1. 形如 0000000\cdots0 的序列权值取决于 00 的个数的奇偶性。
  2. 形如 ???1???\cdots1 的序列权值始终是 00
到这里实际上我们已经可以快速计算某一序列的权值了,方法如下:
  1. 如果序列不存在数字 11 ,归纳成结论 1。
  2. 否则找到序列中最后一个 11 对它使用结论 2,归纳成情况 1。
考虑计算每个区间的权值,枚举右端点,找到右端点前上一个 11 的出现位置,计为 lstlst。那么通过一些简单的讨论,对于每个左端点我们可以 O(1)O(1) 计算该区间权值:
  1. l>lstl>lst,此时区间全 00
  2. l=lstl=lst,此时区间形如 1000100\cdots0,实际上和 l=lst+1l=lst+1 时权值相等。
  3. l<lstl<lst,此时区间形如 ??1000??100\cdots0,权值等于 l=lst+1l=lst+1 的权值异或 11
对于每个右端点直接找出权值为 11 的左端点最小的区间,做一个区间覆盖问题就能知道每个 ii 的答案。
然后考虑一般情况。先拆位,发现每一位的权值按照上面的讨论分成三段。固定右端点,左端点从左到右做一个扫描线状物。注意到每一位的三段权值只有最多四个关键点,那么把每一位的值加起来总共只有 O(logV)O(\log V) 种不同的权值。直接找出这 logV\log V 个区间做区间 chkmax,总时间复杂度 O(nlogV(logV+logn))O(n\log V(\log V+\log n))
具体细节可以看代码。
https://codeforces.com/contest/2103/submission/316770845

评论

0 条评论,欢迎与作者交流。

正在加载评论...