zoukankan      html  css  js  c++  java
  • UVA 11235 Frequent values

     离散化+RMQ。

    离散化存储每个数出现的次数,再RMQ查询max次数。

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 using namespace std;
     5 
     6 const int maxn=100005;
     7 
     8 int count[maxn];
     9 int num[maxn],ll[maxn],rr[maxn];
    10 int tot;
    11 int d[maxn][50];
    12 
    13 int rmq (int l,int r){
    14     int k=0;
    15     while ( (1<<(k+1)) <= r-l+1 ) k++;
    16     return max(d[l][k],d[r-(1<<k)+1][k]);
    17 }
    18 
    19 int main (){
    20     int n,q;
    21     while (cin>>n&&n){
    22         cin>>q;
    23         tot=0;
    24         memset (count,0,sizeof count);
    25         int temp=99999999;
    26         ll[tot]=0;
    27         for (int i=1;i<=n;i++){
    28             int x;
    29             cin>>x;
    30             if (x!=temp){
    31                 temp=x;
    32                 rr[tot]=i-1;
    33                 tot++;
    34                 ll[tot]=i;
    35             }
    36             count[tot]++;
    37             num[i]=tot;
    38         }
    39         rr[tot]=n;
    40         for (int i=1;i<=tot;i++) d[i][0]=count[i];//cout<<count[i]<<" ";cout<<endl;
    41         for (int j=1;(1<<j)<=tot;j++){
    42             for (int i=1;i+(1<<(j-1))<=tot;i++){
    43                 d[i][j]=max (d[i][j-1],d[i+(1<<(j-1))][j-1]);
    44             }
    45         }
    46         while (q--){
    47             int l,r;
    48             cin>>l>>r;
    49             int ans=0;
    50             if (num[l]==num[r]){
    51                 cout<<r-l+1<<endl;
    52                 continue ;
    53             }
    54             //if (rr[num[l]]<=r)
    55                 ans=max (ans,rr[num[l]]-l+1);
    56             //if (ll[num[r]]>=l)
    57                 ans=max (ans,r-ll[num[r]]+1);//cout<<num[l]+1<<" "<<num[r]-1<<"err"<<endl;
    58             if (num[l]+1<=num[r]-1)
    59                 ans=max (ans,rmq (num[l]+1,num[r]-1));//cout<<rmq (num[l]+1,num[r]-1)<<"aaa"<<endl;
    60             cout<<ans<<endl;
    61         }
    62     }
    63     return 0;
    64 }
  • 相关阅读:
    编译Filebeat源码
    一些常用的shell写法
    设置tomcat默认访问的项目
    修改Linux软件源
    k8s创建使用nfs的StorageClass
    使用NFS服务实现文件共享
    idea配置代码注释模板
    redis cluster(集群)模式的创建方式
    etcd简单测试类java版
    Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
  • 原文地址:https://www.cnblogs.com/gfc-g/p/3890817.html
Copyright © 2011-2022 走看看