当前位置: 首页 > news >正文

莫队 Little Elephant and Array

题目链接:Problem - B - Codeforces

题目大意:

给一个长度为 n (n <= 1e5) 的数组 (ai <= 1e9),m (m <= 1e5) 次询问,每次查询一个区间 [l,r] ,求区间内有多少个数 x ,满足 x 在这个区间的出现次数也刚好等于 x 。

Solution:

注意到答案可以离线,考虑莫队,可以算是模板题了。

我们要维护每个数出现的次数,但是 ai <= 1e9 太大了,无法维护所有的数。不过好在 ai > n 的数其实是不需要维护的,因为他们永远不可能出现那么多次嘛。

莫队的主要思想就是:分块 + 排序询问 + 移动区间

Code:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;#define N 100005int n,m,B;
int a[N],bel[N],cnt[N],ans[N],res;struct Query
{int l,r,id;
}q[N];int cmp(Query x,Query y)
{if(bel[x.l] == bel[y.l]) return x.r < y.r ;return bel[x.l] < bel[y.l] ;
}void add(int x)
{if(a[x] > n) return;if(cnt[a[x]] == a[x]) -- res;++ cnt[a[x]];if(cnt[a[x]] == a[x]) ++ res;return;
}void sub(int x)
{if(a[x] > n) return;if(cnt[a[x]] == a[x]) -- res;-- cnt[a[x]];if(cnt[a[x]] == a[x]) ++ res;return;
}int main()
{scanf("%d%d",&n,&m);B = (int)sqrt(n);for (int i = 1;i <= n;++ i) scanf("%d",&a[i]),bel[i] = (i - 1) / B + 1;for (int i = 1;i <= m;++ i){scanf("%d%d",&q[i].l,&q[i].r);q[i].id = i;}sort(q + 1,q + m + 1,cmp);int l,r;l = 1,r = res = 0;for (int i = 1;i <= m;++ i){while (l > q[i].l) add(-- l);while (l < q[i].l) sub(l ++);while (r < q[i].r) add(++ r);while (r > q[i].r) sub(r --);ans[q[i].id] = res;}for (int i = 1;i <= m;++ i) printf("%d\n",ans[i]);return 0;
}

http://www.dtcms.com/a/331681.html

相关文章:

  • GUI Grounding: ScreenSpot
  • 力扣-62.不同路径
  • AM原理与配置
  • 【网络安全测试】手机APP安全测试工具NowSecure 使用指导手册(有关必回)
  • Monsters
  • Redis7学习--持久化机制 RDB与AOF
  • 【SLAM】不同相机模型及其常见的链式求导推导
  • 从“静态文档”到“交互式模拟”:Adobe Captivate企业培训解决方案深度实践
  • OpenCV 高斯模糊降噪
  • IDEA如何引用brew安装的openjdk
  • ts概念讲解
  • 重塑隐私边界,微算法科技(NASDAQ:MLGO)开发基于边缘计算的轻量级区块链身份隐私保护方案
  • QT - QT开发进阶合集
  • 0814 TCP和DUP通信协议
  • 【DFS系列 | 暴力搜索与回溯剪枝】DFS问题实战:如何通过剪枝优化暴力搜索效率
  • Java Map集合精讲:键值对高效操作指南
  • (LeetCode 每日一题) 1780. 判断一个数字是否可以表示成三的幂的和 (数学、三进制数)
  • 【lucene】DocumentsWriterFlushControl
  • Linux与Windows文件共享:Samba配置指南
  • Linux软件编程:进程
  • GoLand 项目从 0 到 1:第八天 ——GORM 命名策略陷阱与 Go 项目启动慢问题攻坚
  • Go 并发控制利器 ants 使用文档
  • Uniapp 中的 uni.vibrate 震动 API 使用指南
  • 4. 索引数据的增删改查
  • ATAM:基于场景的软件架构权衡分析法
  • C语言指针使用
  • 机器翻译:Hugging Face库详解
  • Qwen-Image深度解析:突破文本渲染与图像编辑的视觉革命
  • 网站突然崩了,此站点遇到了致命错误!
  • 从零开始学习:深度学习(基础入门版)(第2天)