洛谷 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

输出格式

对每个询问输出一行,YesNo

输入输出样例

输入 #1

4 21 2 3 21 32 4

输出 #1

YesNo

说明/提示

对于 50 % 50\% 50% 的数据, N , Q ≤ 1 0 3 N,Q \le 10^3 N,Q103
对于 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 1N,Q1051AiN1LiRiN

题意:给出许多区间查询,判断区间中所有的数是否互不相同,是则输入 Yes ,否则输出 No


思路:基础莫队题。

代码如下:

#include 
using 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:LeetCode C++ 279. Perfect Squares【BFS/动态规划/数学】中等
下一篇:LeetCode C++ 459. Repeated Substring Pattern【字符串】简单(KMP)

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月22日 14时14分12秒