洛谷P3901数列找不同-题解
原题:
思路:
莫队
统计的是各个数字的个数
如果说加的时候,sum==1,则颜色种类数++
减的时候,sum==0,则颜色种类数--
但是要注意由于区间排了序,所以要用一种方法来保证顺序不出错。
很简单看代码吧
代码:
#include <bits/stdc++.h> using namespace std; int n,m,block; int a[100050]; int sum[100050]; int res; bool ans; int final_ans[100050]; struct Chunk { int l,r,num; }chunk[100050]; bool cmp(struct Chunk a,struct Chunk b) { return ((a.l/block)==(b.l/block))?(a.r<b.r):(a.l<b.l); } void _del(int i) { sum[a[i]]--; if(sum[a[i]]==0) res--; } void _add(int i) { sum[a[i]]++; if(sum[a[i]]==1) res++; } int main() { cin >> n >> m; for(int i=1;i<=n;i++) { cin >> a[i]; } for(int i=1;i<=m;i++) { cin >> chunk[i].l >> chunk[i].r; chunk[i].num=i; } block=sqrt(n); int l=1; int r=0; sort(chunk+1,chunk+1+m,cmp); for(int i=1;i<=m;i++) { int ql=chunk[i].l; int qr=chunk[i].r; while(l<ql) { _del(l); l++; } while(l>ql) { l--; _add(l); } while(r<qr) { r++; _add(r); } while(r>qr) { _del(r); r--; } final_ans[chunk[i].num]=(qr-ql+1==res)?1:0; } for(int i=1;i<=m;i++) if(final_ans[i]) cout << "Yes" << endl; else cout << "No" << endl; return 0; }