首页 > 其他分享 >时间戳线性基

时间戳线性基

时间:2023-03-31 11:13:11浏览次数:58  
标签:log 复杂度 异或 时间 线性 维护 我们

当我们需要维护和向量空间或者异或和有关的东西,可能会用到线性基:

提出问题

【模板】线性基

题意:给一个长为 \(n\) 的序列,问从中任取若干个数,最大的异或和为多少。

这个问题可以直接使用线性基维护,但是我们考虑将这个问题进行加强:

CF1100F Ivan and Burgers

题意:给一个长为 \(n\) 的序列,\(Q\) 次询问,问从 \(a_l,a_{l+1}\dots a_r\) 中选若干个数,异或和最大为多少。

查询从全局查变成了区间查。

如果使用线段树维护,时间复杂度是 \(O(n\log^2V+Q\log n\log^2V)\)。
如果使用猫树维护,时间复杂度是 \(O(n\log n\log V+Q\log^2V)\)。

深入研究

现在我们继续深究性质,看看能否做到更优的复杂度。

我们先想一想,为什么区间查的线性基不能用全局的维护,某种意义上也就是为什么线性基不支持删除。
因为我们并不知道线性基的每一位是由哪些数组成的,比如说,最高位可能是 \(a_1\oplus a_3\oplus a_4\),或者最低位是 \(a_{114}\oplus a_{514}\)。
这就导致我们并不知道在查区间的时候,能不能选择某一位。

先假定我们的询问区间都是形如 \([l,n]\) 的,考虑如何处理。
我们考虑记录每一位中编号最小的数的下标 \(b\),比如我们上面那两个例子中,就是 \(1\) 和 \(114\)。
在处理询问 \([l,n]\) 是,我们就扫一遍,如果 \(b\geqslant l\),我们就按照正常的线性基进行处理,否则就跳过它。
所以,为了保证答案的正确性,我们要上每一位的 \(b\) 尽可能的大,来满足更多的 \(l\)。
现在我们考虑加入一个数的时候如何保证每一位都得到了最大的 \(b\)。
我们维护二元组,分别表示线性基插入的数和它的时间戳。
当这个数某一位为 \(1\) 的时候,考虑线性基中的当前位:如果为空,则直接插入;如果有数,且其时间戳更小,则交换这两个二元组,并将不在线性基中的数异或上另一个。
具体实现如下:

void insert(int a,int tm)
{
    for(int i=19;~i;i--)
    {
        if(a&(1<<i))
        {
            if(tim[i])
            {
                if(tim[i]<tm)
                {
                    swap(xxj[i],a);
                    swap(tim[i],tm);
                }
                a^=xxj[i];
            }
            else
            {
                xxj[i]=a,tim[i]=tm;
                return;
            }
        }
    }
    return;
}

这样子,我们只需要顺序将所有元素插入,并在每一次插入后处理的 \(r=i\) 的询问即可。
时间复杂度是 \(O((n+Q)\log V)\)。

拓展延申

上述算法是离线的,那能不能在线呢?
由于线性基大小是 \(O(\log V)\) 的,所以我们每次处理都在前一个的复制上进行处理,就不会破坏前面的线性基了,时间复杂度仍然是 \(O((n+Q)\log V)\) 的。

上述算法是静态的,那能不能带修呢?
不知道,但感觉多半不行。

标签:log,复杂度,异或,时间,线性,维护,我们
From: https://www.cnblogs.com/Xun-Xiaoyao/p/17275653.html

相关文章

  • DC-DC直流线性可调升压模块高压稳压输出电源5v12v24v48v转0-300V0-500V/0-600V/0-1000
    GRB系列非隔离宽电压输入高电压稳压输出特点 效率高达75%以上 1*2英寸标准封装 单电压输出 可直接焊在PCB上 工作温度:-40℃~+75℃ 阻燃封装,满足UL94-V0要求 温度特性好 电压控制输出,输出电压随控制电压的变化线应用GRB系列模块电源是一种DC-DC升压变换器。该模块电......
  • Linux系统把时间类型值转换为数值型的方法是什么?
    在实际工作中,我们往往会遇到各式各样的需求,今天老男孩教育小编给大家介绍一下,如何把时间类型值转换为数值类型,以下是详细的内容:1.取子串函数格式:substr(c,n1.n2)功能:取字符串C第n1个字符起的n2个字符.返回值类型是字符型.例:取姓名字符串中的姓.store"......
  • 视频融合平台EasyCVR设备录像因时间导致播放异常问题的排查与解决
    EasyCVR视频融合平台可提供丰富的视频能力,支持视频直播、录像、回放、检索、云存储、告警上报、语音对讲、集群、电子地图、智能分析以及平台级联等。平台可支持多协议、多类型设备接入,包括国标GB28181、RTMP、RTSP/Onvif、海康SDK、大华SDK、海康Ehome等,近期我们又拓展了更多SDK......
  • system Verilog display 时间
    目前的NPU模块的modulelevelsim是c和sv混合的,npucore的行为由ccode生成。方针的pattern有时候需要加入一些delay,ccode自带的mdelay不能满足要求,自带的环境里面有一个d......
  • c#通过DateTime.Now获取当前时间星期值
    1、获取星期数字例如:周四:4//int类型Convert.ToInt32(DateTime.Now.DayOfWeek.ToString("d"));//string类型DateTime.Now.DayOfWeek.ToString("d"); 2、获取得......
  • 基于stm32的数控线性稳压电源,恒压恒流电源资料
    基于stm32的数控线性稳压电源,恒压恒流电源资料。极具学习和设计参考价值,资料包括源程序,原理图,pcb等设计资料本设计采用220V市电输入工频变压器,将220V交流电压降为24V交......
  • 对于使用element-ui中的日期时间选择器产生的json数据转换格式报错
    对于使用element-ui中的日期时间选择器产生的json数据转换格式报错报错如下所示JSONparseerror:Cannotdeserializevalueoftypejava.time.LocalDateTimefromStr......
  • MySQL查询数据时间戳和日期的转换
    在数据库的使用中,经常需要按指定日期来查询记录,以便于统计,而在数据库中,有很多存储的是时间戳,也有的直接存日期,查询的时候可能不是那么好弄。mysql提供了两个函数:from_un......
  • Ceres 中的线性求解器类型(linear_solver_type)
    CeresSolver中的线性求解器类型(linear_solver_type)有多个选项,包括:DENSE_QR:使用稠密QR分解方法求解线性方程组。适用于内存足够的小规模问题,求解速度较快。DENSE_SCHUR:......
  • ARMA-GARCH-COPULA模型和金融时间序列案例|附代码数据
    原文链接: http://tecdat.cn/?p=3385最近我们被客户要求撰写关于ARMA-GARCH-COPULA的研究报告,包括一些图形和统计输出。最近我被要求撰写关于金融时间序列的copulas的调......