• 【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
    ",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.
  • 相关阅读:
    「仰望天空和脚踏实地」​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​写出我心(一百四十八)
    Backtrader中文笔记之Analyzers(二次修复)
    Backtrader中文笔记之Tick Data and Resampling
    NumPy学习记录
    mac通过ln创建软连接使用。
    mac电脑Pycharm的书签设置。
    matplotlib学习记录.
    Backtrader中文笔记之Pandas DataFeed Example
    Backtrader中文笔记之Using Indicators(指标)
    chmod
  • 原文地址:https://www.cnblogs.com/myx12345/p/9283577.html
Copyright © 2020-2023  润新知