莫队算法(优雅的暴力)

小B的询问

题目描述

小B 有一个长为 n n n 的整数序列 a a a,值域为 [ 1 , k ] [1,k] [1,k]
他一共有 m m m 个询问,每个询问给定一个区间 [ l , r ] [l,r] [l,r],求:
∑ i = 1 k c i 2 \sum\limits_{i=1}^k c_i^2 i=1kci2

其中 c i c_i ci 表示数字 i i i [ l , r ] [l,r] [l,r] 中的出现次数。
小B请你帮助他回答询问。

输入格式

第一行三个整数 n , m , k n,m,k n,m,k

第二行 n n n 个整数,表示 小B 的序列。

接下来的 m m m 行,每行两个整数 l , r l,r l,r

输出格式

输出 m m m 行,每行一个整数,对应一个询问的答案。

样例 #1

样例输入 #1

6 4 3
1 3 2 1 1 3
1 4
2 6
3 5
5 6

样例输出 #1

6
9
5
2

提示

【数据范围】
对于 100 % 100\% 100% 的数据, 1 ≤ n , m , k ≤ 5 × 1 0 4 1\le n,m,k \le 5\times 10^4 1n,m,k5×104

代码:

#include<bits/stdc++.h>using namespace std;typedef long long ll;
typedef pair<int, int>PII;
const int N = 1e6 + 10;
const int MOD = 998244353;
const int INF = 0X3F3F3F3F;
const int dx[] = {-1, 1, 0, 0, -1, -1, +1, +1};
const int dy[] = {0, 0, -1, 1, -1, +1, -1, +1};
const int M = 1e9 + 7;//莫队算法板子(优雅的暴力)ll res;
ll pos[N];
ll a[N];
ll cnt[N];//记录出现的次数
ll ans[N];//记录答案
struct que
{int l, r, k;bool operator < (const que&w) const{return pos[l] == pos[w.l] ? r < w.r : l < w.l;   };
}q[N];void add(int x)
{cnt[a[x]] ++;res += (cnt[a[x]]) * (cnt[a[x]]) - (cnt[a[x]] - 1) * (cnt[a[x]] - 1);
}void sub(int x)
{cnt[a[x]] --;res -= (cnt[a[x]] + 1) * (cnt[a[x]] + 1) - (cnt[a[x]]) * (cnt[a[x]]);
}
int main()
{int n, m, k;cin >> n >> m >> k;int siz = sqrt(n);for(int i = 1; i <= n; i ++) {cin >> a[i];pos[i] = i / siz;}for(int i = 1; i <= m; i ++){cin >> q[i].l >> q[i].r;q[i].k = i;}sort(q + 1, q + 1 + m);int l = 1, r = 0;for(int i = 1; i <= m; i ++){while(q[i].l < l) add(-- l);while(q[i].r > r) add(++ r);while(q[i].l > l) sub(l ++);while(q[i].r < r) sub(r --);ans[q[i].k] = res;}for(int i = 1; i <= m; i ++) cout << ans[i] << endl;return 0;
}

莫队(发现了nmd,map得时间复杂度都是log,莫队又是暴力直接就超时了呜呜呜)

Little Elephant and Array

题面翻译

小象喜欢和数组玩。现在有一个数组 a a a,含有 n n n 个正整数,记第 i i i 个数为 a i a_i ai

现在有 m m m 个询问,每个询问包含两个正整数 l j l_j lj r j ( 1 ⩽ l j ⩽ r j ⩽ n ) r_j \;(1\leqslant l_j\leqslant r_j\leqslant n) rj(1ljrjn),小象想知道在 A l j A_{l_j} Alj A r j A_{r_j} Arj 之中有多少个数 x x x,其出现次数也为 x x x

输入格式

第一行 n n n m m m n n n 表示数组大小, m m m 表示询问个数;

第二行共 n n n 个数,第 i i i 个数为 a i a_i ai 的值;

接下来 m m m 行,每行两个数 l j l_j lj r j r_j rj,意义如题面。

输出格式

m m m 行,每行一个数,表示每一次询问的答案。

样例输入 #1

7 2
3 1 2 2 3 3 7
1 7
3 4

样例输出 #1

3
1

代码:

#include<bits/stdc++.h>using namespace std;typedef long long ll;
typedef pair<int, int>PII;
const int N = 1e6 + 10;
const int MOD = 998244353;
const int INF = 0X3F3F3F3F;
const int dx[] = {-1, 1, 0, 0, -1, -1, +1, +1};
const int dy[] = {0, 0, -1, 1, -1, +1, -1, +1};
const int M = 1e9 + 7;//莫队算法板子(优雅的暴力)
//nmd map得时间复杂度
ll res;
ll pos[N];
ll a[N];
ll cnt[N];//记录出现的次数
ll ans[N];//记录答案
ll n, m;
struct que
{ll l, r, k;
}q[N];bool cmp(que a, que b)
{return pos[a.l] == pos[b.l] ? a.r < b.r : pos[a.l] < pos[b.l];
}
void add(ll x)
{if(a[x] > n) return ;if(cnt[a[x]] == a[x]) res --;cnt[a[x]] ++;if(cnt[a[x]] == a[x]) res ++;
}void sub(ll x)
{if(a[x] > n)  return ;if(cnt[a[x]] == a[x]) res --;cnt[a[x]] --;if(cnt[a[x]] == a[x]) res ++;
}
int main()
{cin >> n >> m;ll siz = sqrt(n);for(ll i = 1; i <= n; i ++) {scanf("%lld", &a[i]);pos[i] = i / siz;}for(ll i = 1; i <= m; i ++){scanf("%lld%lld", &q[i].l, &q[i].r);q[i].k = i;}sort(q + 1, q + 1 + m, cmp);ll l = 1, r = 0; for(ll i = 1; i <= m; i ++){while(q[i].l < l) add(-- l);while(q[i].r > r) add(++ r);while(q[i].l > l) sub(l ++);while(q[i].r < r) sub(r --);ans[q[i].k] = res;}for(ll i = 1; i <= m; i ++) cout << ans[i] << '\n';return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/63428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能】用Python构建高效的自动化数据标注工具:从理论到实现

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 数据标注是构建高质量机器学习模型的关键环节,但其耗时耗力常成为制约因素。本篇文章将介绍如何用Python构建一个自动化数据标注工具,结合机器学习和NLP技术,帮助加速数据标注过程。我们将从需求分析入…

DAY35|动态规划Part03|LeetCode:01背包问题 二维、01背包问题 一维、416. 分割等和子集

目录 01背包理论基础&#xff08;一&#xff09; 基本思路 C代码 01背包理论基础&#xff08;二&#xff09; 基本思路 C代码 LeetCode:416. 分割等和子集 基本思路 C代码 01背包理论基础&#xff08;一&#xff09; 题目链接&#xff1a;卡码网46. 携带研究材料 文字…

elasticsearch-如何给文档新增/更新的字段

文章目录 前言elasticsearch-如何给文档新增/更新的字段1. 如何给某些文档新增/更新的字段2. 给所有文档添加/更新一个新的字段3. 测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且…

World Labs发布最新3D世界生成模型 | 李飞飞引领AI创新

随着人工智能技术的飞速发展&#xff0c;3D生成模型作为一个新兴领域&#xff0c;正逐步改变我们与虚拟世界的互动方式。2023年12月3日&#xff0c;李飞飞教授领导的AI初创公司World Labs发布了他们的最新成果——一款能够将单张图片转化为完整3D世界的生成模型。这个模型不仅突…

分布式cap

P&#xff08;分区安全&#xff09;都能保证&#xff0c;就是在C&#xff08;强一致&#xff09;和A&#xff08;性能&#xff09;之间做取舍。 &#xff08;即立马做主从同步&#xff0c;还是先返回写入结果等会再做主从同步。类似的还有&#xff0c;缓存和db之间的同步。&am…

cocos creator接入字节跳动抖音小游戏JSAPI敏感词检测(进行文字输入,但输入敏感词后没有替换为*号)

今天更新了某个抖音小游戏的版本&#xff0c;增加了部分剧情&#xff0c;半天过后一条短信审核未通过&#xff0c;emmm…抖音总是能给开发者惊喜…打开电脑看看这次又整什么幺蛾子… 首先是一脸懵逼&#xff0c;后端早已接入了官方的内容安全检测能力了&#xff08;https://de…

软件无线电安全之GNU Radio基础(下)

往期回顾 软件无线电安全之GUN Radio基础(上) 背景 在上一小节中&#xff0c;我们简单介绍和使用了GNU Radio软件的基础功能和模块&#xff0c;同时通过GNU Radio Companion&#xff08;GRC&#xff09;创建了简单的流程图&#xff0c;展示了信号生成、处理和输出的流程。最后…

Gitee配置SSH公钥

采用SSH协议同步Git仓库代码的好处就是高效。在配置好SSH公钥后&#xff0c;不需要每次操作都要输入用户名和密码&#xff08;主要针对命令行来说&#xff09;。 以我个人项目为例。 生成 SSH 公钥 1. 通过命令 ssh-keygen 生成 SSH Key&#xff1a; ssh-keygen -t ed25519…

2024年认证杯SPSSPRO杯数学建模D题(第一阶段)AI绘画带来的挑战解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 D题 AI绘画带来的挑战 原题再现&#xff1a; 2023 年开年&#xff0c;ChatGPT 作为一款聊天型AI工具&#xff0c;成为了超越疫情的热门词条&#xff1b;而在AI的另一个分支——绘图领域&#xff0c;一款名为Midjourney&#xff08;MJ&#xff…

高级sql技巧

高级SQL技巧包括以下几个方面&#xff1a; 使用视图&#xff08;Views&#xff09;&#xff1a;视图是基于一个或多个表的查询结果集&#xff0c;使用视图可以简化复杂的查询操作并提高可读性。 使用子查询&#xff08;Subqueries&#xff09;&#xff1a;子查询是一个嵌套在主…

算法-字符串-5.最长回文子串

一、题目&#xff1a; 二、思路解析 1.思路&#xff1a; 最长子串——动态数组 2.常用方法&#xff1a; a.字符串的截断 ress.substring(start,end1); 3.核心逻辑&#xff1a; 1.特殊情况&#xff1a;字符串为空或字符串的长度为0 if(snull||s.length())return ""…

避大坑!Vue3中reactive丢失响应式的问题

在vue3中,我们定义响应式数据无非是ref和reactive。 但是有的小伙伴会踩雷&#xff01;导致定义的响应式丢失的问题。 reactive丢失响应式的情况1&#xff08;直接赋值&#xff09; 场景: 1.你定义了一个数据:let datareactive({name:"",age:"" }) 2.然后你…

高中数学:计数原理-二项式定理

文章目录 一、二项式定理与通项公式二、二项式系数的性质 一、二项式定理与通项公式 我们先来看完全平方公式 二、二项式系数的性质

Linux学习笔记14 了解磁盘:何为HDD,SSD?sata?PCIE?分区,MBR,GPT (上)

前文有学习文件系统的概念。介绍了Linux组织文件的方式和文件的分类。 但是最初的时候&#xff0c;最先有的并不是文件系统。而是磁盘。 要我说&#xff0c;最关键的那句话就是&#xff1a;分区存在自己的文件系统。而磁盘存在自己的分区。 磁盘 我们一般指的是在linux中以…

刷题计划day26 回溯(五)回溯止【N 皇后】【解数独】

⚡刷题计划day26 回溯&#xff08;五&#xff09;继续&#xff0c;回溯最后一个专题&#xff0c;今天的是hard题&#xff0c;也是比较经典的题型&#xff0c;可以点个免费的赞哦~ 往期可看专栏&#xff0c;关注不迷路&#xff0c; 您的支持是我的最大动力&#x1f339;~ 目录…

Next.js系统性教学:深入理解部分预渲染与边缘计算

更多有关Next.js教程&#xff0c;请查阅&#xff1a; 【目录】Next.js 独立开发系列教程-CSDN博客 目录 更多有关Next.js教程&#xff0c;请查阅&#xff1a; 1. 部分预渲染&#xff08;Partial Prerendering&#xff09; 1.1 什么是部分预渲染&#xff1f; 1.1.1 部分预渲…

Ubuntu 20.04安装rsync 3.2.7

前言 Ubuntu 20.04的apt中不支持rsync 3.2.0的安装&#xff0c;因此需要手动编译安装&#xff0c;记录下过程 ~$ apt policy rsync rsync:已安装&#xff1a;(无)候选&#xff1a; 3.1.2-2.1ubuntu1.6版本列表&#xff1a;3.1.3-8ubuntu0.7 -1100 /var/lib/dpkg/status下载所…

UE5基本数据类型

bool: 表示布尔值&#xff0c;只有两个取值&#xff1a;true 或 false&#xff0c;用于表示逻辑条件。int8: 表示 8 位的有符号整数&#xff0c;范围是 −128−128 到 127127。uint8: 表示 8 位的无符号整数&#xff0c;范围是 00 到 255255。int16: 表示 16 位的有符号整数&am…

Linux中的rpm命令

rpm&#xff08;Red Hat Package Manager&#xff09;是一个用于管理基于 RPM 的 Linux 发行版&#xff08;如 Red Hat、CentOS、Fedora 等&#xff09;软件包的命令行工具。你可以使用 rpm 命令来查询、安装、卸载、升级和验证 RPM 软件包。 ### 常用的 rpm 命令&#xff1a;…

【C++游戏程序】easyX图形库还原游戏《贪吃蛇大作战》(三)

承接上一篇文章&#xff1a;【C游戏程序】easyX图形库还原游戏《贪吃蛇大作战》&#xff08;二&#xff09;&#xff0c;我们这次来补充一些游戏细节&#xff0c;以及增加吃食物加长角色长度等设定玩法&#xff0c;也是本游戏的最后一篇文章。 一.玩家边界检测 首先是用来检测…