【LibreOJ10121】与众不同(RMQ,二分)
题意:
思路:
C++
1 #include<map> 2 #include<set> 3 #include<cmath> 4 #include<cstdio> 5 #include<vector> 6 #include<cstring> 7 #include<cstdlib> 8 #include<iostream> 9 #include<algorithm> 10 #define M 1000000 11 #define MAXN 210000 12 using namespace std; 13 14 int g[MAXN][20]; 15 int last[M*3]; 16 int a[MAXN],st[MAXN],f[MAXN]; 17 18 int ask(int x,int y) 19 { 20 if(x>y) return 0; 21 int len=y-x+1; int l=log(len)/log(2); 22 return max(g[x][l],g[y-(1<<l)+1][l]); 23 } 24 25 int main() 26 { 27 freopen("data.in","r",stdin); 28 freopen("1.out","w",stdout); 29 int n,m,x,y; 30 scanf("%d%d",&n,&m); 31 for(int i=1;i<=n;i++) 32 { 33 scanf("%d",&a[i]); 34 a[i]+=M; 35 st[i]=max(st[i-1],last[a[i]]+1); 36 last[a[i]]=i; 37 g[i][0]=f[i]=i-st[i]+1; 38 } 39 int l=log(n)/log(2); 40 for(int i=1;i<=l;i++) 41 for(int j=1;j+(1<<(i-1))<=n;j++) 42 g[j][i]=max(g[j][i-1],g[j+(1<<(i-1))][i-1]); 43 for(int i=1;i<=m;i++) 44 { 45 scanf("%d%d",&x,&y); 46 x++; y++; 47 int l=x; int r=y; 48 int tmp=x; 49 while(l<=r) 50 { 51 int mid=(l+r)/2; 52 if(st[mid]<x) {tmp=mid;l=mid+1;} 53 else r=mid-1; 54 } 55 int ans=max(tmp-x+1,ask(tmp+1,y)); 56 printf("%d\n",ans); 57 } 58 return 0; 59 } 60
pascal
1 const maxn=200000; 2 max=1000000; 3 var n,m,i,x,y,t,j,ans,keypoint,l,r:longint; 4 a,opt,pre:array[1..maxn]of longint; 5 rmq:array[1..maxn,0..20]of longint; 6 f:array[-max..max]of longint; 7 ch:char; 8 function find(x,y:longint):longint; 9 var left,right,mid:longint; 10 begin 11 left:=x;right:=y; 12 while left<=right do begin 13 mid:=(left+right)shr 1; 14 if pre[mid]<=y then left:=mid+1 15 else right:=mid-1; 16 end; 17 find:=left; 18 end; 19 function findmax(x,y:longint):longint; 20 var i,j:longint; 21 begin 22 i:=0;j:=1; 23 while 2*j<=y-x+1 do begin 24 inc(i); 25 j:=j*2; 26 end; 27 if rmq[x,i]>rmq[y+1-j,i] then findmax:=rmq[x,i] 28 else findmax:=rmq[y+1-j,i]; 29 end; 30 begin 31 assign(input,'data.in'); reset(input); 32 assign(output,'right.out'); rewrite(output); 33 readln(n,m); 34 for i:=1 to n do read(a[i]); 35 fillchar(f,sizeof(f),0); 36 opt[n]:=1; 37 pre[n]:=n; 38 f[a[n]]:=n; 39 for i:=n-1 downto 1 do begin 40 opt[i]:=opt[i+1]+1; 41 pre[i]:=pre[i+1]; 42 if (f[a[i]]>0)and(f[a[i]]-i<opt[i]) then begin 43 opt[i]:=f[a[i]]-i; 44 pre[i]:=f[a[i]]-1; 45 end; 46 f[a[i]]:=i; 47 end; 48 fillchar(rmq,sizeof(rmq),0); 49 for i:=1 to n do rmq[i,0]:=opt[i]; 50 i:=1;t:=2; 51 while t<=n do begin 52 for j:=1 to n-t+1 do begin 53 if rmq[j,i-1]>rmq[j+(1 shl (i-1)),i-1] then rmq[j,i]:=rmq[j,i-1] 54 else rmq[j,i]:=rmq[j+(1 shl (i-1)),i-1] 55 end; 56 inc(i); 57 t:=t*2; 58 end; 59 for i:=1 to m do begin 60 readln(l,r); 61 inc(l);inc(r); 62 if l>r then begin 63 j:=l;l:=r;r:=j; 64 end; 65 keypoint:=find(l,r); 66 ans:=0; 67 if keypoint>l then ans:=findmax(l,keypoint-1); 68 if (keypoint<=r)and(r-keypoint+1>ans) then begin 69 ans:=r-keypoint+1; 70 end; 71 writeln(ans); 72 end; 73 close(input); 74 close(output); 75 end.
null