热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Gty的二逼妹子序列-分块与莫队算法的应用

Autumn和Bakser正在研究Gty的妹子序列,但遇到了一个难题。他们希望计算某个区间内美丽度属于[a,b]的妹子的美丽度种类数。本文将详细介绍如何利用分块和莫队算法解决这一问题。

Gty的二逼妹子序列

Autumn 和 Bakser 正在研究 Gty 的妹子序列,但遇到了一个难题。他们希望计算某个区间内美丽度属于 [a, b] 的妹子的美丽度种类数。为了简化问题,假设所有妹子的美丽度都在 [1, n] 范围内。

给定一个长度为 n (1 <= n <= 100000) 的正整数序列 s (1 <= si <= n),以及 m (1 <= m <= 1000000) 次询问 “l, r, a, b”。每次询问需要输出 sl 到 sr 中,权值属于 [a, b] 的权值的种类数。

输入格式

第一行包含两个整数 n 和 m (1 <= n <= 100000, 1 <= m <= 1000000),表示数列 s 中的元素数和询问数。

第二行包含 n 个整数 s1 到 sn (1 <= si <= n)。

接下来 m 行,每行包含 4 个整数 l, r, a, b (1 <= l <= r <= n, 1 <= a <= b <= n),表示一次询问。

保证所有涉及的数在 C++ 的 int 范围内,并且输入是合法的。

输出格式

对于每个询问,单独输出一行,表示 sl 到 sr 中权值属于 [a, b] 的权值的种类数。

样例输入

10 10
    4 4 5 1 4 1 5 1 2 1
    5 9 1 2
    3 4 7 9
    4 4 2 5
    2 3 4 7
    5 10 4 4
    3 9 1 1
    1 4 5 9
    8 9 3 3
    2 2 1 6
    8 9 1 4

样例输出

2
    0
    0
    2
    1
    1
    1
    0
    1
    2

样例解释

部分解释如下:

  • 5 9 1 2: 子序列为 4 1 5 1 2,在 [1, 2] 里的权值有 1, 1, 2,共 2 种,因此答案为 2。
  • 3 4 7 9: 子序列为 5 1,在 [7, 9] 里的权值有 5,共 1 种,因此答案为 1。
  • 4 4 2 5: 子序列为 1,没有权值在 [2, 5] 中,因此答案为 0。
  • 2 3 4 7: 子序列为 4 5,权值在 [4, 7] 中的有 4, 5,因此答案为 2。

建议使用输入/输出优化。

解决方案

使用分块和莫队算法可以高效地解决这个问题。具体步骤如下:

  • 对权值进行分块处理。
  • 使用莫队算法对询问进行排序和处理。

关键点在于询问的排序方式,确保每次移动指针时的复杂度尽可能低。

代码实现

#include
#include
#include
#include
#include
using namespace std;

int read() {
    int x = 0, f = 1; char ch = getchar();
    while (ch <'0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
    return x * f;
}

#define maxn 100010
#define maxm 1000100

int n, m, a[maxn], pos[maxn], num[maxn], an[maxn], bll, bln;

struct Asknode {
    int l, r, a, b, id;
    bool operator <(const Asknode &A) const {
        if (pos[l] == pos[A.l]) return r  R) move1(nr), nr--;
    while (nl > L) nl--, move2(nl);
    while (nr 

感谢 Gty 大哥、块爷和 Bakser 学长的指导。

前排围观自己的傻逼错误:

技术分享

【BZOJ-3809】Gty的二逼妹子序列 分块 + 莫队算法


推荐阅读
  • 地球坐标、火星坐标及百度坐标间的转换算法 C# 实现
    本文介绍了WGS84坐标系统及其精度改进历程,探讨了火星坐标系统的安全性和应用背景,并详细解析了火星坐标与百度坐标之间的转换算法,提供了C#语言的实现代码。 ... [详细]
  • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
  • 在Kubernetes集群中部署Kuboard
    本文详细介绍了如何在Kubernetes(简称k8s)环境中部署Kuboard,包括必要的命令和步骤,帮助用户顺利完成安装。 ... [详细]
  • 本文介绍了iftop的下载地址、基本参数配置方法及其在不同Linux发行版中的安装问题解决方案。iftop是一款强大的实时网络流量监控工具,适用于需要精确监控网络带宽使用情况的场景。 ... [详细]
  • 题目描述了一个病毒检测问题,要求使用AC自动机算法统计目标文本中多个模式串的出现次数。 ... [详细]
  • 本文介绍了一种高效的方法来计算特定月份内的工作日数量,并提供了一段SQL代码示例,该方法通过优化减少了不必要的循环,提高了查询效率。 ... [详细]
  • [Head First设计模式笔记]命令模式
    命令模式定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。类图:适用设计方案举例:实现一种遥控器,该遥控器具有七个可编程的插 ... [详细]
  • 本文介绍了两种获取和研究 .NET Framework 源代码的有效途径:一是通过官方提供的下载链接获取完整源代码,并使用 Visual Studio 进行本地查看;二是利用在线资源平台,直接在网页上浏览源代码。 ... [详细]
  • 本文介绍了如何使用Gradle和gdx-setup.jar工具来创建LibGDX项目,包括详细的步骤和注意事项,适合初学者和有经验的开发者。 ... [详细]
  • MyEclipse技巧:高效生成toString方法
    本文将介绍如何在MyEclipse中快速且高效地生成toString方法,帮助开发者简化编码过程,提高开发效率。 ... [详细]
  • 本文详细介绍了在Delphi环境中对DLL文件进行断点调试的方法,包括设置依赖的可执行文件、编译器和链接器的调试选项,以及运行时参数的配置。 ... [详细]
  • 详细的介绍针对graphiclayer的空间查询。首先,空间查询的方式:提供多种类型的空间查询,包括点周边、线周边、面内等多种方式;其次,图形绘制完成后状态的展示;再次 ... [详细]
  • 本文介绍如何通过简单的代码封装,创建一个能够灵活应用于多种场景的通用选择器,提高前端开发效率。 ... [详细]
  • 本文详细介绍了使用JavaScript和jQuery进行页面加载初始化的方法,包括不同的实现方式及其应用场景,并探讨了两者在初始化过程中的主要区别。 ... [详细]
  • Java中'=='与'equals'方法的区别
    在Java编程语言中,'=='操作符用于比较两个对象的引用是否指向同一个内存位置,而'equals'方法则用于比较两个对象的内容是否相等。本文通过具体示例详细解释了两者的差异,并提供了代码演示。 ... [详细]
author-avatar
展翅翱翔512
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有