這題數據加強以後是真讓人感受HHios
LG1972 HH的項鍊數據結構
改數據以後應該用西安段素或者梳妝十足,然而我也懶得改了,就發一個如今過不了的墨對算fa(然而卡一卡說不定能過)spa
一 墨對是什麼指針
墨對是一個叫莫濤的dalao fa明的,是一種極其暴力的處理區間問題的數據結構(其實分塊(逃。code
主要利用了分塊blog
二 思想排序
將詢問的區間排序,而後用兩個指針X**跳(沒了)。ci
codestring
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn = 500010; int col[maxn],ans[maxn],sum[1000003],n,m,base,answer; int l,r; struct Q { int left; int right; int id; } ques[maxn]; int q_sum = 0; bool comp(Q a,Q b) { if(a.left/base!=b.left/base) return a.left<b.left; else return a.right<b.right; } inline void add(int x) { if(++ sum[x] == 1) answer ++; } inline void del(int x) { if(-- sum[x] == 0) answer --; } int main() { ios::sync_with_stdio(false); cin>>n; base=sqrt(n); for(int i=1; i<=n; i++) cin>>col[i]; cin>>m; for(int i=1; i<=m; i++) { cin>>ques[++q_sum].left; cin>>ques[q_sum].right; ques[q_sum].id=q_sum; } sort(ques+1,ques+q_sum+1,comp); l = ques[1].left; r = l-1; for(int i=1; i<=q_sum; i++) { while(l<ques[i].left) del(col[l++]); while(l>ques[i].left) add(col[--l]); while(r>ques[i].right) del(col[r--]); while(r<ques[i].right) add(col[++r]); ans[ques[i].id]=answer; } for(int i=1; i<=q_sum; i++) cout<<ans[i]<<endl; return 0; }