洛谷P3901數列找不同-題解
阿新 • • 發佈:2020-08-27
原題:
思路:
莫隊
統計的是各個數字的個數
如果說加的時候,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; }