镇江网站关键字优化,国外搜索引擎大全不屏蔽,国外免费域名,wordpress 主体安装Written with StackEdit. 题目描述 有一个长度为\(n\)的数组\({a_1,a_2,...,a_n}\)。\(m\)次询问#xff0c;每次询问一个区间内最小没有出现过的自然数。 Input 第一行\(n,m\)。 第二行为\(n\)个数。 从第三行开始#xff0c;每行一个询问\(l,r\)。 Output 一行一个数#… Written with StackEdit. 题目描述 有一个长度为\(n\)的数组\({a_1,a_2,...,a_n}\)。\(m\)次询问每次询问一个区间内最小没有出现过的自然数。 Input 第一行\(n,m\)。 第二行为\(n\)个数。 从第三行开始每行一个询问\(l,r\)。 Output 一行一个数表示每个询问的答案。 Sample Input 5 5 2 1 0 2 1 3 3 2 3 2 4 1 2 3 5 Sample Output 1 2 3 0 3 HINT 对于\(30\%\)的数据\(1n,m1000.\) 对于\(100\%\)的数据:\(1n,m2000000ai10^91lrn.\) Solution 多个区间询问,可以离线,并且可以\(O(1)\)转移,考虑使用莫队.但是\(a_i\leq 10^9\),直接开个\(cnt\)数组记录当前区间内的各种个数似乎不可做?然而,对于大于\(n\)的元素,我们可以直接无视它.一方面,它一定不会成为答案,否则需要出现至少\(0\)~\(n\) 这\(n1\)个数.另一方面,它肯定不会对答案做出贡献.否则答案也会大于\(n\),据上,不可能.所以\(a_i\)的范围只是虚张声势...我们处理时将大于\(n\)的数都视作\(n1\)即可.然后就是一个愉快的莫队板子题了.#includebits/stdc.h
using namespace std;
typedef long long LoveLive;
inline int read()
{int out0,fh1;char jpgetchar();while ((jp9||jp0)jp!-)jpgetchar();if (jp-){fh-1;jpgetchar();}while (jp0jp9){outout*10jp-0;jpgetchar();}return out*fh;
}
const int MAXN2e510;
int cnt[MAXN];
setint s;
int Ans[MAXN];
int n,m;
int a[MAXN];
int belong[MAXN],BlockSize;
int L,R,res;
struct Query{int l,r;int id;bool operator (const Query rhs) const {if(belong[l]!belong[rhs.l])return belong[l]belong[rhs.l];return belong[r]belong[rhs.r];}
}q[MAXN];
void BuildBlocks()
{BlockSizesqrt(n);for(int i1;in;i)belong[i](i/BlockSize)1;
}
void add(int pos)
{cnt[a[pos]];for(int ires;in2;i)if(cnt[i]0){resi;return;}
}
void remove(int pos)
{--cnt[a[pos]];if(cnt[a[pos]]0)resmin(res,a[pos]);
}
int main()
{nread(),mread();for(int i1;in;i)a[i]read(),a[i]a[i]n?n1:a[i];for(int i1;im;i){q[i].idi;q[i].lread();q[i].rread(); }for(int i0;in;i)s.insert(i);a[0]n2;BuildBlocks();sort(q1,q1m);L0,R0;for(int i1;im;i){int lq[i].l,rq[i].r;while(Ll)remove(L),L;while(Ll)--L,add(L);while(Rr)R,add(R);while(Rr)remove(R),--R;Ans[q[i].id]res;}for(int i1;im;i)printf(%d\n,Ans[i]);return 0;
} 转载于:https://www.cnblogs.com/jklover/p/10105545.html