首页 > 其他 > 详细

洛谷P3901 数列找不同 [莫队]

时间:2018-05-24 14:36:21      阅读:185      评论:0      收藏:0      [点我收藏+]

  题目传送门

  

题目描述

现有数列 A_1,A_2,\cdots,A_NA1?,A2?,?,AN? ,Q 个询问 (L_i,R_i)(Li?,Ri?) , A_{Li} ,A_{Li+1},\cdots,A_{Ri}ALi?,ALi+1?,?,ARi? 是否互不相同

输入输出格式

输入格式:

 

第1 行,2 个整数 N,QN,Q

第2 行,N 个整数 A_{Li} ,A_{Li+1},\cdots,A_{Ri}ALi?,ALi+1?,?,ARi?

Q 行,每行2 个整数 L_i,R_iLi?,Ri?

 

输出格式:

 

对每个询问输出一行,“Yes” 或者“No”

 

输入输出样例

输入样例#1: 复制
4 2
1 2 3 2
1 3
2 4
输出样例#1: 复制
Yes
No

说明

• 对于50% 的数据, N,Q \le 10^3N,Q103

• 对于100% 的数据, 1 \le N,Q \le 10^5, 1 \le A_i \le N, 1 \le L_i \le R_i \le N1N,Q105,1Ai?N,1Li?Ri?N

 


  分析:很明显的莫队模板,轻松A。不过过程中被卡了读优。。。有点尴尬。。。

  Code:

 

 1 #include<bits/stdc++.h>
 2 #define Fi(i,a,b) for(int i=a;i<=b;i++)
 3 using namespace std;
 4 const int N=1e5+7;
 5 int n,m,s,num=0,d[N],pos[N],sum[N];bool ans[N];
 6 struct Node{int l,r,id;}a[N];
 7 inline bool cmp(Node x,Node y)
 8 {return pos[x.l]==pos[y.l]?x.r<y.r:x.l<y.l;}
 9 inline void change(int i,bool f)
10 {
11   if(f){sum[d[i]]++;if(sum[d[i]]==1)num++;}
12   else {sum[d[i]]--;if(sum[d[i]]==0)num--;}
13 }
14 int main()
15 {
16   ios::sync_with_stdio(false);
17   cin>>n>>m;s=int(sqrt(n));
18   memset(ans,false,sizeof(ans));
19   Fi(i,1,n){cin>>d[i];pos[i]=(i-1)/s+1;}
20   Fi(i,1,m){cin>>a[i].l>>a[i].r;a[i].id=i;}
21   sort(a+1,a+1+m,cmp);int l=1,r=0;
22   Fi(i,1,m){
23     while(l<a[i].l)change(l++,0);
24     while(l>a[i].l)change(--l,1);
25     while(r<a[i].r)change(++r,1);
26     while(r>a[i].r)change(r--,0);
27     if(num==a[i].r-a[i].l+1)ans[a[i].id]=true;}
28   Fi(i,1,m)if(ans[i])printf("Yes\n");else printf("No\n");
29   return 0;
30 }

 

洛谷P3901 数列找不同 [莫队]

原文:https://www.cnblogs.com/cytus/p/9082565.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!