Title: Description
Input
Fix it.
L = (l_0 + x-1) mod n + 1, r = (r_0 + x-1) mod n + 1
Output
Sample Input6 3
1 2 3 2 1 2
1 5
3 6
1 5Sample Output1
2
1HINT
Fixed under:
n <= 40000, M <= 50000
Source
Vani Original
Exercises
As a. A block template question hit me for 2 hours Have to say that the code ability and focus is not enough In addition, we learned a good way to save complexity and space ... (See how tot in Getans changes to 1 each time)
Code:
#include <iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<ctime>#include<cctype>#include<cstring>#include<string>#include<algorithm>using namespacestd;Const intn=4e4+5;intvisit[n],tim,n,m,num[n],cnt[n][205],ans[205][205],tot[n],temp[n],id[n],s,idx[n],len,tots,left[n],right[n];BOOLJud[n];inlineintR () {CharCintf=0; for(C=getchar ();c<'0'|| C>'9'; c=GetChar ()); for(; c<='9'&&c>='0'; c=GetChar ()) F= (f<<3) + (f<<1) +c-'0'; returnF;} InlinevoidPre () {Sort (temp+1, temp+n+1); Len=unique (temp+1, temp+n+1)-temp-1; for(intI=1; i<=n;i++) { intt=Num[i]; Num[i]=lower_bound (temp+1, temp+len+1, Num[i])-temp; Idx[num[i]]=T; } //discretization of-------------------------------------------------------S= (int) sqrt (n); Tots=0; for(intI=1; i<=n;i++) { if(i%s==0) id[i]=tots,right[tots]=i,jud[i]=true; Else if(i%s==1) id[i]=++tots,left[tots]=i; Elseid[i]=Tots; } Right[tots]=n,jud[n]=1; //chunked ------------------------------------------------ for(intI=1; i<=n;i++) Cnt[num[i]][id[i]]++; for(intI=2; i<=tots;i++) for(intj=1; j<=len;j++) Cnt[j][i]+=cnt[j][i-1]; //Statistics CNT------------------------------------------ for(intI=1; i<=tots;i++) { intmaxx=0, anss=1e+8; memset (Tot,0,sizeof(tot)); for(intj=left[i];j<=n;j++) {Tot[num[j]]++; if(tot[num[j]]>maxx| | (TOT[NUM[J]]==MAXX&&NUM[J]<ANSS)) maxx=tot[num[j]],anss=Num[j]; if(jud[j]==true) ans[i][id[j]]=Anss; } } //statistics ans------------------------------------------}inlineintGetans (intAintb) {Tim++; if(b-a+1<2*s) {intmaxx=0, anss=1e+8; for(inti=a;i<=b;i++) { if(Visit[num[i]]!=tim) visit[num[i]]=tim,tot[num[i]]=1; Elsetot[num[i]]++; if(tot[num[i]]>maxx| | ((Tot[num[i]]==maxx) &&num[i]<anss)) Maxx=tot[num[i]],anss=Num[i]; } returnIdx[anss]; } Else { intlefts,rights; if(a%s==1) lefts=Id[a]; Elselefts=id[a]+1; if(b%s==0) rights=Id[b]; Elserights=id[b]-1; intanss=ans[lefts][rights],maxx=cnt[anss][rights]-cnt[anss][lefts-1]; for(inti=a;i<left[lefts];i++) { if(Visit[num[i]]!=tim) visit[num[i]]=tim,tot[num[i]]=1; Elsetot[num[i]]++; if(tot[num[i]]+cnt[num[i]][rights]-cnt[num[i]][lefts-1]>maxx| | ((tot[num[i]]+cnt[num[i]][rights]-cnt[num[i]][lefts-1]==maxx) &&num[i]<anss)) Maxx=tot[num[i]]+cnt[num[i]][rights]-cnt[num[i]][lefts-1],anss=Num[i]; } for(inti=right[rights]+1; i<=b;i++) { if(Visit[num[i]]!=tim) visit[num[i]]=tim,tot[num[i]]=1; Elsetot[num[i]]++; if(tot[num[i]]+cnt[num[i]][rights]-cnt[num[i]][lefts-1]>maxx| | ((tot[num[i]]+cnt[num[i]][rights]-cnt[num[i]][lefts-1]==maxx) &&num[i]<anss)) Maxx=tot[num[i]]+cnt[num[i]][rights]-cnt[num[i]][lefts-1],anss=Num[i]; } returnIdx[anss]; }}intMain () {//freopen ("a.in", "R", stdin);N=r (), m=R (); for(intI=1; i<=n;i++) {Num[i]=r (); temp[i]=Num[i]; } pre (); inta,b,t=0; for(intI=1; i<=m;i++) {a=r (), b=R (); A= (a+t-1)%n+1; b= (b+t-1)%n+1; if(a>b) Swap (A, a); T=Getans (A, b); printf ("%d\n", T); } return 0;}
Algorithm review--chunking algorithm