莫队算法 暴力
Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 1120  Solved: 580

Description

Bzoj3339 Rmq Problem_#include

Input

Bzoj3339 Rmq Problem_#include_02

Output

Bzoj3339 Rmq Problem_ios_03

Sample Input

7 5
0 2 1 0 1 3 2
1 3
2 3
1 4
3 6
2 7

Sample Output

3
0
3
2
4

HINT

 

Bzoj3339 Rmq Problem_分块_04

 

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 }

 

本文为博主原创文章,转载请注明出处。