热门标签 | 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的二逼妹子序列 分块 + 莫队算法


推荐阅读
  • 从零开始编译Linux系统:第16章 全新起点
    本章将详细介绍如何从零开始编译一套完整的Linux系统,涵盖关键组件如glibc库的介绍及其重要性。通过本文,读者将了解从源代码构建Linux系统的全过程。 ... [详细]
  • 阿里云 Aliplayer高级功能介绍(八):安全播放
    如何保障视频内容的安全,不被盗链、非法下载和传播,阿里云视频点播已经有一套完善的机 ... [详细]
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • packagecom.panchan.tsmese.utils;importjava.lang.reflect.ParameterizedType;importjava.lang. ... [详细]
  • 经过一年的思考,我发现自己对开发的兴趣并不浓厚,而对算法研究则更加热衷。本文将探讨开发与算法之间的本质差异,并分享我的未来学习计划。 ... [详细]
  • Manacher算法详解:寻找最长回文子串
    本文将详细介绍Manacher算法,该算法用于高效地找到字符串中的最长回文子串。通过在字符间插入特殊符号,Manacher算法能够同时处理奇数和偶数长度的回文子串问题。 ... [详细]
  • 2017年5月9日学习总结
    本文记录了2017年5月9日的学习内容,包括技术分享和相关知识点的深入探讨。 ... [详细]
  • 本文章提供了适用于 Cacti 的多核 CPU 监控模板,支持 2、4、8、12、16、24 和 32 核配置。请注意,0.87g 版本的 Cacti 需要手动修改哈希值为 0021 才能使用,而 0.88 及以上版本则可直接导入。 ... [详细]
  • 本文为初学者提供了一条清晰的学习路线,帮助他们逐步成长为优秀的Web开发人员。通过十个关键步骤,涵盖从基础到高级的各个方面,确保每位学习者都能找到适合自己的学习方向。 ... [详细]
  • JavaSE For循环入门示例
    本文将介绍Java中For循环的基本概念和使用方法,通过几个简单的示例帮助初学者更好地理解和掌握For循环。 ... [详细]
  • 本文介绍了如何使用Postman构建和发送HTTP请求,包括四个主要部分:方法(Method)、URL、头部(Headers)和主体(Body)。特别强调了Body部分的重要性,并详细说明了不同类型的请求体。 ... [详细]
  • 本文介绍了 Confluence 6 中使用的其他 Cookie,这些 Cookie 主要用于存储产品的基本持久性和用户偏好设置,以提升用户体验。 ... [详细]
  • 本文介绍了一种支付平台异步风控系统的架构模型,旨在为开发类似系统的工程师提供参考。 ... [详细]
  • 使用 Git Rebase -i 合并多个提交
    在开发过程中,频繁的小改动往往会生成多个提交记录。为了保持代码仓库的整洁,我们可以使用 git rebase -i 命令将多个提交合并成一个。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
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社区 版权所有