首页 > 其他分享 >离线操作

离线操作

时间:2023-10-30 14:13:02浏览次数:42  
标签:int 询问 离线 区间 扫描线 升序 操作

将询问离线,根据询问的区间$[l,r]$的按特定的顺序排序。一般是按$r$进行升序。

当没有询问时,可以当作是无数个区间,然后每次$r++$即可维护所有的区间,这个技术被某些人称为扫描线,但实质上是与计算几何中的扫描线不是一个东西,只是为了形象的描述而已。

eq1.P1972 HH的项链

题解

将询问离线,改成按$r$升序排序。发现同一个数字,只有最近出现的才会对答案有贡献。

维护一个树状数组,维护每个位置的贡献。对于新加入的区间的每个元素,每次对上一次位置的贡献减1(即变回0),对当前位置贡献加1(即变为1)。

然后查询$[l,r]$即可。

查看代码

struct qwq {
    int l, r, id;
    bool friend operator<(qwq a, qwq b) {
        return a.r < b.r;
    }
};

void Solve(int TIME) {

    int n;cin >> n;
    vi a(n + 1);for (int i = 1;i <= n;i++) cin >> a[i];
    int m;cin >> m;
    vc<qwq> v(m + 1);
    for (int i = 1;i <= m;i++) {
        int l, r;cin >> l >> r;
        v[i] = { l,r,i };
    }
    sort(v.begin() + 1, v.end());
    int lastR = 0;map<int, int> lst;vi ans(m + 1);
    BIT tr(n + 1);

    for (int i = 1;i <= m;i++) {
        auto [l, r, id] = v[i];
        for (int j = lastR + 1;j <= r;j++) {
            if (lst.count(a[j])) tr.add(lst[a[j]], -1);
            tr.add(j, 1);
            lst[a[j]] = j;
        }
        lastR = r;
        ans[id] = tr.query(l, r);
    }
    for (int i = 1;i <= m;i++) cout << ans[i] << endl;

}

 

标签:int,询问,离线,区间,扫描线,升序,操作
From: https://www.cnblogs.com/mrsuns/p/17797683.html

相关文章

  • 解决kubernetes flannel部署的具体操作步骤
    原文:https://blog.51cto.com/u_16175446/6683522KubernetesFlannel部署教程作为一名经验丰富的开发者,我将向你介绍在Kubernetes中部署Flannel网络插件的步骤和所需的代码。Flannel是一个用于Kubernetes集群的网络解决方案,它负责为Pod提供网络互通。整体流程以下是部署Kubernete......
  • C++中低级内存操作
    C++中低级内存操作C++相较于C有一个巨大的优势,那就是你不需要过多地担心内存管理。如果你使用面向对象的编程方式,你只需要确保每个独立的类都能妥善地管理自己的内存。通过构造和析构,编译器会帮助你管理内存,告诉你什么时候需要进行内存操作。将内存管理隐藏在类中显著提高了可用性,......
  • 记一次ubuntu服务器挂载磁盘挂载操作记录
    操作背景:服务器重启后,/OPT目录下的数据全部不见了。排查是数据盘没有成功挂载导致。推断之前是临时挂载,未配置到挂载信息配置文件导致。操作目的:配置挂载信息,以后重启也会自动挂载。开始配置:查看设备UUID使用命令:blkid查看设备:/dev/vdb或者使用命令:ls-l/dev/disk/by-uuid......
  • 命名虚拟机及设置安装路径怎么操作
    设置“处理器数量”和“每个处理器的内核数量”,可以在网络上搜索一下自己的CPU处理器的型号信息,或者在Windows系统中打开任务管理器,然后访问性能选项卡,该选项卡右下侧的逻辑处理器数量就是您的CPU内核数量。设置CPU处理器信息设置内存分配量设置网络类型设置SCSI控制器的类型设置虚......
  • 机房WSUS服务器搭建方案-服务器操作
    服务器操作打开管理工具中的WSUS管理控制台,完成以下有关操作同步更新建立计算机(命名组名XPCLENT)审批更新选项设置......
  • C# redis操作(StackExchange.Redis )
    参考:https://www.cnblogs.com/wzh2010/p/17205387.html参考:https://www.runoob.com/redis/redis-keys.html测试redis,使用StackExchange.Redis的api,实现发布/订阅, 存放值, 分布式锁,排序usingSystem;usingSystem.Collections.Concurrent;usingSystem.Collect......
  • 嵌入式硬件库的基本操作方式与分析
    本次要介绍的开源软件是c-periphery:https://github.com/vsergeev/c-periphery一个用C语言编写的硬件外设访问库。我们可以用它来读写Serial、SPI、I2C等,非常适合在嵌入式产品上使用。我们可以基于它优秀的代码框架,不断地扩展出更多的功能模块,最终形成自己产品适用的Linux硬......
  • Flink客户端操作
    一、mysql数据准备mysql-hip-uroot-p密码CREATEDATABASEflink;USEflink;CREATETABLEuser(idINTEGERNOTNULLPRIMARYKEY,nameVARCHAR(255)NOTNULLDEFAULT'flink',addressVARCHAR(1024),phone_numberVARCHAR(512),emailVARCHAR(255));INSERT......
  • Python 利用pymysql和openpyxl操作MySQL数据库并插入Excel数据
    1.需求分析本文将介绍如何使用Python连接MySQL数据库,并从Excel文件中读取数据,将其插入到MySQL数据库中。2.环境准备在开始本文之前,请确保您已经安装好了以下环境:Python3.xPyMySQL库openpyxl库MySQL数据库3.连接MySQL数据库我们可以使用pymysql库来连接MySQL数据库......
  • EDA工具使用+GIT操作+python编程+C语言编程+Riscv相关+TCL操作
    EDA工具使用Verdi覆盖率转网页urg-full64-dirsimv.vdbVerdi加载sessionverdi-ssrsessionFileVcs分部编译额外选项-partcomp:自动分块编译。-fastpartcomp:使用多核计算系统并行部分编译。-pcmakeprof:查看每部分编译占用的时间,方便对时间更久的进行拆分。-partc......