洛谷 P3901 数列找不同【莫队】
发布日期:2021-07-01 02:50:09
浏览次数:3
分类:技术文章
本文共 1892 字,大约阅读时间需要 6 分钟。
题目描述
现有数列 A 1 , A 2 , … , A N A_1,A_2,\ldots,A_N A1,A2,…,AN, Q Q Q 个询问 ( L i , R i ) (L_i,R_i) (Li,Ri) ,询问 A L i , A L i + 1 , … , A R i A_{L_i} ,A_{L_i+1},\ldots,A_{R_i} ALi,ALi+1,…,ARi 是否互不相同。输入格式
第一行,两个整数 N , Q N,Q N,Q 。第二行, N N N 个整数 A 1 , A 2 , … , A N A_1, A_2, \ldots , A_N A1,A2,…,AN 。接下来 Q Q Q 行,每行两个整数 L i , R i L_i,R_i Li,Ri 。输出格式
对每个询问输出一行,Yes
或 No
。 输入输出样例
输入 #14 21 2 3 21 32 4
输出 #1
YesNo
说明/提示
对于 50 % 50\% 50% 的数据, N , Q ≤ 1 0 3 N,Q \le 10^3 N,Q≤103 。 对于 100 % 100\% 100% 的数据, 1 ≤ N , Q ≤ 1 0 5 , 1 ≤ A i ≤ N , 1 ≤ L i ≤ R i ≤ N 1 \le N,Q \le 10^5,1 \le A_i \le N,1 \le L_i \le R_i \le N 1≤N,Q≤105,1≤Ai≤N,1≤Li≤Ri≤N 。题意:给出许多区间查询,判断区间中所有的数是否互不相同,是则输入 Yes
,否则输出 No
。
思路:基础莫队题。
代码如下:
#includeusing namespace std;const int maxn = 1e5 + 5;int a[maxn];int pos[maxn];bool ans[maxn]; //第几个询问的区间中是否每个数都互不相同 int cnt[maxn]; //记录区间[l,r]中的每个数的出现次数 struct Q { int l, r, i;} q[maxn];//题目询问的是区间[l,r]中的所有数是否互不相同,转换为//[l,r]中互不相同的数的个数是否等于区间大小r-l+1,等于则互不相同,否则存在相同的数 int res = 0; //[l,r]中互不相同的数的个数void Add(int n) { ++cnt[a[n]]; if (cnt[a[n]] == 1) ++res; } //出现了一个不同的数,res++ void Sub(int n) { --cnt[a[n]]; if (cnt[a[n]] == 0) --res; } //失去了一个不同的数,res-- int main() { int n, m; scanf("%d%d", &n, &m); int size = sqrt(n); for (int i = 1; i <= n; ++i) { scanf("%d", &a[i]); pos[i] = i / size; } for (int i = 0; i < m; ++i) { scanf("%d%d", &q[i].l, &q[i].r); q[i].i = i; } sort(q, q + m, [](const Q &a, const Q &b) { return pos[a.l] == pos[b.l] ? a.r < b.r : pos[a.l] < pos[b.l]; }); int l = 1, r = 0; for (int i = 0; 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--); //第几个询问的答案是区间[l,r]中互不相同的数的个数 //等于区间大小r-l+1则互不相同,否则存在相同的数 ans[q[i].i] = (res == r - l + 1) ? true : false; } for (int i = 0; i < m; ++i) printf("%s\n", ans[i] ? "Yes" : "No"); return 0;}
转载地址:https://memcpy0.blog.csdn.net/article/details/108219059 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月22日 14时14分12秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
分布式事务原理探究(一)
2019-05-01
spring cloud consul 应用的多实例名的解决
2019-05-01
人工智能为什么这么火?看看安防江湖30年血战就知道了
2019-05-01
“前端智能为安防产生新的数据价值”
2019-05-01
(8)CMake入门笔记--CMake语法
2019-05-01
头文件中 #ifndef---#define---#endif的作用
2019-05-01
Ant内置任务之whichresource
2019-05-01
Ant内置任务之symlink
2019-05-01
深入理解python--线程、进程与协程(1)
2019-05-01
字符串的排序
2019-05-01
内存分配(mallloc,calloc,realloc,new)
2019-05-01
使用 Minidumps 和 Visual Studio .NET 进行崩溃后调试
2019-05-01
struts返回xml数据例子
2019-05-01
内存对齐详解
2019-05-01
秋招总结(一)-C++归纳
2019-05-01
秋招总结(三)-操作系统归纳
2019-05-01
带缓冲I/O 和不带缓冲I/O的区别与联系
2019-05-01
LINUX CP命令详解
2019-05-01
source insight快捷键及使用技巧
2019-05-01