Bzoj3339 Rmq Problem
Submit: 1120 Solved: 580
Description
Input
Output
Sample Input
7 5
0 2 1 0 1 3 2
1 3
2 3
1 4
3 6
2 7
0 2 1 0 1 3 2
1 3
2 3
1 4
3 6
2 7
Sample Output
3
0
3
2
4
0
3
2
4
HINT
Source
询问分块 莫队 暴力
只要记录每个数字出现的次数,修改的时候暴力更新答案即可。
SX博主居然忘了cnt++的时候也可能使cnt变为0,然后就无比自信地写成了30行那样,然后光荣地成为了整个status里wa最多的人
替自己的智商感到担忧.jpg
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const int mxn=200010; 10 int read(){ 11 int x=0,f=1;char ch=getchar(); 12 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 13 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} 14 return x*f; 15 } 16 int cnt[mxn*20]; 17 struct que{ 18 int l,r; 19 int m,id; 20 }q[mxn]; 21 int cmp(que a,que b){ 22 return (a.m<b.m)||(a.m==b.m && a.r<b.r); 23 } 24 int n,m,a[mxn]; 25 int ans[mxn]; 26 int nowans; 27 inline void add(int x){ 28 if(x>n)return; 29 ++cnt[x]; 30 // while(cnt[nowans])nowans++; 31 if(x<nowans) 32 { 33 if(!cnt[x])nowans=x; 34 } 35 else if(nowans==x) 36 { 37 while(cnt[nowans])nowans++; 38 } 39 return; 40 } 41 inline void del(int x){ 42 if(x>n)return; 43 --cnt[x]; 44 if(!cnt[x])nowans=min(nowans,x); 45 return; 46 } 47 void solve(){ 48 int i,j; 49 int l=1,r=0; 50 nowans=0; 51 for(i=1;i<=m;i++){ 52 while(l<q[i].l){del(a[l]);l++;} 53 while(l>q[i].l){l--;add(a[l]);} 54 while(r>q[i].r){del(a[r]);r--;} 55 while(r<q[i].r){r++;add(a[r]);} 56 ans[q[i].id]=nowans; 57 } 58 return; 59 } 60 int main(){ 61 int i,j; 62 n=read();m=read(); 63 for(i=1;i<=n;i++){ 64 a[i]=read(); 65 } 66 int len=sqrt(n); 67 for(i=1;i<=m;i++){ 68 q[i].l=read(); q[i].r=read(); 69 q[i].m=(q[i].l-1)/len+1; 70 q[i].id=i; 71 } 72 sort(q+1,q+m+1,cmp); 73 solve(); 74 for(i=1;i<=m;i++)printf("%d\n",ans[i]); 75 return 0; 76 }
本文为博主原创文章,转载请注明出处。