「题解」火神之友

(火神:爷究竟交了些什么冤种……)

原题目链接:link

「我的做题历程」:

step1:观察题面。

「他的好朋友风神给他一个有 N 个自然数的数组,然后对他进行 Q 次查询。每一次查询包含两个正整数 (L,R),表示一个数组中的一个区间 ([L,R]),火神需要回答在这个区间中有多少个值刚好出现 (2) 次」,对于这种单点修改区间查询(但此处是对区间元素种类总数的查询),自然是想到树状数组,当然也有可能是莫队。(对于目前所学而言,题型:树状数组)

step2:思考解法。

先从最简单的想起。假如数组元素全部相同的话(默认枚举指针为 (i))。
(就像酱紫↓)

「题解」火神之友

随着区域左指针不变,右指针从左往右遍历,我们应该如何去维护呢。

「题解」火神之友

当区域为 ([1,1]) 时,没有值刚好出现 (2) 次的元素。恰好,我们什么都不需要操作。

「题解」火神之友

当区域为 ([1,2]) 时,(i) 号元素 (3) 与 (i – 1) 号元素相同,(i – 1) 号元素的位置上加一(表示 该位与该位的后一个数相同)。在这一个区间里,(3) 刚好出现 (2) 次,所以区域 ([1,2]) 的价值为 (1) ,维护成功。

「题解」火神之友

当区域为 ([1,3]) 时,(i) 号元素 (3) 与 (i – 1) 号元素相同,(i – 1) 号元素的位置上加一。在这一个区间里,(3) 出现 (3) 次, 没有刚好出现两次的值,所以区域 ([1,3]) 的价值应该为 (0),但此时却是 (2)。

「题解」火神之友

于是,我们在当前 (i – 2) 号元素的位置上减 (2)(表示该元素后面还有两个相邻元素与它相同。 (3) 个连续元素相同,其价值为零)。此时区域 ([1,3]) 的价值为 (0),维护成功。

「题解」火神之友

当区域为 ([1,4]) 时,(i) 号元素 (3) 与 (i – 1) 号元素相同,(i – 1) 号元素的位置上加一。在这一个区间里,(3) 出现 (4) 次, 没有刚好出现两次的值,所以区域 ([1,4]) 的价值应该为 (0),但此时却是 (-1)。

「题解」火神之友

于是,我们在当前 (i – 3) 号元素的位置上加 (1)(表示该元素后面有三个连续元素与它相同,加一来维护平衡。 (4) 个连续元素相同,其价值仍为零)。此时区域 ([1,4]) 的价值为 (0),维护成功。

「题解」火神之友
当区域为 ([1,5]) 时,(i) 号元素 (3) 与 (i – 1) 号元素相同,(i – 1) 号元素的位置上加一,在 (i – 2) 号元素的位置上减 (2),在 (i – 3) 号元素的位置上加 (1)。可以发现,此时我们维护成功了。以此类推,后面所有操作都是平衡的。(蓝色的加一表示:该位与后一位数相同; 绿色的减二表示:该元素后面还有两个相邻元素与它相同,减去多算的两对;紫色的加一表示:该元素后面有三个连续元素与它相同,补上多去的一对)
看完后你可能会发出疑问,你是不是「dou」得呀???欸,还真不是。
「题解」火神之友

我们在计算的时候总是在 (i – 1) 号位上加一,是为了 记录当前有多少对满足题意的元素(在图中等价于记录当前位置的左括号有多少,其前缀和即当前区间 ([1,i]) 满足题意的元素对数)。但是遇到上图这种情况,(连续三个元素相等,出现两对相同元素)我们 需要舍弃这两对,于是乎在 (i – 2) 号位上减二。你可能又会问,那为啥不在 (i – 1) 号位上减呢?那如果在 (i – 1) 号位上减的话,区间 ([i – 1, i]) 你又打算怎么算呢。

「题解」火神之友
遇到这种情况时,我们的操作是在(i – 1) 号元素的位置上加一,在 (i – 2) 号元素的位置上减 (2),在 (i – 3) 号元素的位置上加 (1)。前面两个操作已解释过,不再赘述。如图(四个相同元素同框),我们按前两个操作记录了满足题意的对数,舍弃不符合题意的,这时候,我们会发现—— 我们实际舍弃了四对((i – 2) 号减二,(i – 3) 号减二), 实际只需舍弃三对。于是乎,在 (i – 3) 号位上加一,表示我 多舍弃了一对,现补上(如果你要问为什么不在其他位加一,我只能告诉你是为了后面方便求答案,道理同前)。
前面光是讲全是相同元素的情况了,可实际的数据不一定是这样啊 (疑似伪证)。别急,我们将这种观念放进数据,思考:是否可以将原数据改造成我们想要的样子呢?
(搞笑哦)
确实可以。我们可以 将相同的元素分别穿在同一条链上,分别计算。明显的,我们这样互不干扰的计算没有问题,只需同类与同类进行比较,将答案累加即可(在实现中,累加等价于直接在同一个树状数组中)。
特别的,我们需要 边维护边出答案。如果 维护完了再出答案的话,部分靠前的元素会记录到一些该区间本没有的信息。譬如 (3\ 3\ 3\ 3\ 3\ 3\ 3\ 3),若是维护完后再求区间 ([1,3]) 的话,(2) 号位会记录到信息:「该元素后面还有两个相邻元素与它相同」,但实际该区间内并不存在这种情况。

step3:完成代码。

代码(抵制学术不端行为,拒绝 Ctrl + C):

#include
using namespace std;
typedef long long ll;
const int N = 5e5 + 5;
int n, q, l, r, BIT[N], last[N], ans[N];
ll a[N];
map mp;
struct node {
    int l, r, id;
} b[N];
bool cmp(node x, node y) { return x.r < y.r; }
int lowbit(int x) { return x & -x; }
void update(int x, int k) {
    for (int i = x; i = 1; i -= lowbit(i)) {
        ans += BIT[i];
    }
    return ans;
}
int main() {
    scanf("%d %d", &n, &q);
    for (int i = 1; i

赫菲斯托斯:阿涅弥伊你完犊子了!!1( 风神留下了 Accepted 扬长而去)

让我们来解决 『火神之友』 叭~

Bye bye!!1 👋👋

Original: https://www.cnblogs.com/kylin-king/p/16497696.html
Author: 北柒kylin
Title: 「题解」火神之友

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/588156/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 牛客小白月赛37

    蒟蒻能写几道水题题解吧 根据题意模拟,都还活着就加上两人攻击力和,同时小于等于0,直接跳出,还有一方存活加上10*攻击力退出 #include<cstdio> #inc…

    数据结构和算法 2023年6月7日
    087
  • 八一特别行动 社论

    素材 八一特别行动 题目背景 九条可怜 知乎评论 洛谷 Logo 画图 3D 自带素材(树篱贴纸) A. 南 B. 昌 C. 起 D. 义 A. 南 定义 (f_i) 为取完 (i…

    数据结构和算法 2023年6月7日
    0116
  • 洛谷 P2758 编辑距离

    一道典型的 线性 DP 题。 状态定义 像这种线性动态规划,一种常见的状态定义方法是:用 (f_i) 表示 前(i) 个元素满足要求(只考虑前 (i) 个元素)时的最佳答案。 因此…

    数据结构和算法 2023年6月8日
    096
  • test 1004 打铁记

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月12日
    069
  • linux多路转接select—服务器代码

    一、linux多路转接select—服务器代码 #include #include #include #include<string.h> #include…

    数据结构和算法 2023年6月8日
    099
  • Java学习笔记

    1. Java语言介绍 在需要运行Java应用程序的操作系统中,安装一个与操作系统对应的Java虚拟机即可。Java虚拟机(JVM)就像一个翻译一样,将java语言程序翻译成各种操…

    数据结构和算法 2023年6月12日
    083
  • 集合幂级数相关

    CHANGE LOG NOI 大纲里没有把位运算卷积如 FMT,FWT,子集卷积等知识点单独列出,但高维前缀和(SOSDP)是应用比较广泛的重要算法。 学习上述算法,首先要理解什么…

    数据结构和算法 2023年6月12日
    0106
  • 别像弱智一样提问 Stop-Ask-Questions-The-Stupid-Ways

    https://github.com/xcr1234/Stop-Ask-Questions-The-Stupid-Ways 你真的准备好了吗? 感谢群友 for you 提供 避免…

    数据结构和算法 2023年6月16日
    0121
  • 【Unity】UI面板:倒计时器

    一、添加文本(UI -> text) 二、创建脚本(CountdownTimer) 第一种方法: 1、首先在方法外声明两个变量 private Text txtTimer; …

    数据结构和算法 2023年6月16日
    0102
  • SpringBoot 中 MyBatis-Plus 集成动态多数据源过程(亲测可用)

    使用场景 当你的项目中使用到多个数据源或者需要在程序运行过程中动态的添加数据源时可以参考本文中的实现。这里使用的是 dynamic-datasource-spring-boot-s…

    数据结构和算法 2023年6月8日
    0134
  • 数据结构复习笔记

    1.1 数据结构的基本概念 数据: 数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 数据元素…

    数据结构和算法 2023年6月12日
    070
  • 「题解」蝙蝠侠的麻烦

    没 事 找 事 「蝙蝠侠需要找到一个 最长的字符串,使得这个字符串作为 一个子序列被包含在所有的三个字符串中」,可以得出这是一道 最长公共子序列,而且 有三个字符串。(题型:线性 …

    数据结构和算法 2023年6月8日
    099
  • java多线程之-不可变final

    package com.ldp.demo08final; import lombok.extern.slf4j.Slf4j; import java.text.ParseExcep…

    数据结构和算法 2023年6月12日
    084
  • Rust双向链表

    节点的结构 指向节点的指针可能为空值,所以在最外层包裹一层 Option 一个节点可能存在被两个指针指向(前一个节点的 next 和后一个节点的 prev),指针需要用 Rc 包裹…

    数据结构和算法 2023年6月7日
    097
  • 如何发现问题

    如何发现问题 服务端开发实践分享 引入 过去,我们常常讨论:如何解决问题? 往往一个项目上线前,反馈很好,稳定性很高。 但是,上线后,卡顿、炸服、宕机,常有的事。 问题还是有的,只…

    数据结构和算法 2023年6月7日
    099
  • 「题解」异或

    披着位运算皮的莫队(114514) 原题出处:没找到 原题链接:题库暂未公开 「我的做题历程」: step1:观察题面 题面如下图。 图 1 题面 看到这个「区间询问」,我的脑子里…

    数据结构和算法 2023年6月8日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球