UVa11235 sparse-table RLE
2016-06-29 16:28
281 查看
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23846
游程编码(RunLength Encoding) RLE, Spares-Table
动态询问数组中出现最多的值的出现次数
/*************************************************************************
> File Name: UVa11235.cpp
> Author:HaoWei
> Mail:liang199611@outlook.com
> Created Time: 2016年06月29日 星期三 15时24分53秒
************************************************************************/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=111111;
#define rep(i,n) for(int i=0;i<n;i++)
int a[maxn],n,cnt,q;
int kount[maxn],id[maxn],ll[maxn],rr[maxn];
int d[maxn][22];
void RMQ_init(int n)
{
rep(i,n) d[i][0]=kount[i];
for(int j=1;(1<<j)<=n;j++)
for(int i=0;i+(1<<j)-1<n;i++)
d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
}
int RMQ(int L,int R)
{
int k=0;
while((1<<(k+1))<=R-L+1) k++;
return max(d[L][k],d[R-(1<<k)+1][k]);
}
int main()
{
while(scanf("%d%d",&n,&q)==2)
{
if(!n) break;
rep(i,n) scanf("%d",&a[i]);
memset(ll,-1,sizeof(ll));memset(rr,-1,sizeof(rr));
cnt=0;
rep(i,n){
if(i==0) kount[cnt]=1,ll[i]=0;
else if(a[i]!=a[i-1]) kount[++cnt]=1,rr[i-1]=i-1,ll[i]=i;
else kount[cnt]++;
id[i]=cnt;
}
rr[n-1]=n-1;cnt++;
for(int i=0;i<n;i++) if(i!=0&&ll[i]==-1) ll[i]=ll[i-1];
for(int i=n-1;i>=0;i--) if(i!=(n-1)&&rr[i]==-1) rr[i]=rr[i+1];
RMQ_init(cnt);
/* rep(i,n) printf(" id:%d ll:%d rr:%d",id[i],ll[i],rr[i]);
cout<<endl;
rep(i,cnt) printf("count:%d ",kount[i]);*/
rep(tt,q)
{
int L,R,l,r,res;
scanf("%d%d",&L,&R);L--,R--;
// printf("\nrr[L]:%d,L:%d,R:%d,ll[R]:%d\n",rr[L],L,R,ll[R]);
//L=id[L];R=id[R];
l=id[L]+1;r=id[R]-1;
if(id[L]==id[R]) {printf("%d\n",R-L+1);continue;}
res=max(rr[L]-L+1,R-ll[R]+1);
// printf("\nleft:%d right:%d\n",l,r);
if(r>=l) res=max(res,RMQ(l,r));
printf("%d\n",res);
}
}
return 0;
}
游程编码(RunLength Encoding) RLE, Spares-Table
动态询问数组中出现最多的值的出现次数
/*************************************************************************
> File Name: UVa11235.cpp
> Author:HaoWei
> Mail:liang199611@outlook.com
> Created Time: 2016年06月29日 星期三 15时24分53秒
************************************************************************/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=111111;
#define rep(i,n) for(int i=0;i<n;i++)
int a[maxn],n,cnt,q;
int kount[maxn],id[maxn],ll[maxn],rr[maxn];
int d[maxn][22];
void RMQ_init(int n)
{
rep(i,n) d[i][0]=kount[i];
for(int j=1;(1<<j)<=n;j++)
for(int i=0;i+(1<<j)-1<n;i++)
d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
}
int RMQ(int L,int R)
{
int k=0;
while((1<<(k+1))<=R-L+1) k++;
return max(d[L][k],d[R-(1<<k)+1][k]);
}
int main()
{
while(scanf("%d%d",&n,&q)==2)
{
if(!n) break;
rep(i,n) scanf("%d",&a[i]);
memset(ll,-1,sizeof(ll));memset(rr,-1,sizeof(rr));
cnt=0;
rep(i,n){
if(i==0) kount[cnt]=1,ll[i]=0;
else if(a[i]!=a[i-1]) kount[++cnt]=1,rr[i-1]=i-1,ll[i]=i;
else kount[cnt]++;
id[i]=cnt;
}
rr[n-1]=n-1;cnt++;
for(int i=0;i<n;i++) if(i!=0&&ll[i]==-1) ll[i]=ll[i-1];
for(int i=n-1;i>=0;i--) if(i!=(n-1)&&rr[i]==-1) rr[i]=rr[i+1];
RMQ_init(cnt);
/* rep(i,n) printf(" id:%d ll:%d rr:%d",id[i],ll[i],rr[i]);
cout<<endl;
rep(i,cnt) printf("count:%d ",kount[i]);*/
rep(tt,q)
{
int L,R,l,r,res;
scanf("%d%d",&L,&R);L--,R--;
// printf("\nrr[L]:%d,L:%d,R:%d,ll[R]:%d\n",rr[L],L,R,ll[R]);
//L=id[L];R=id[R];
l=id[L]+1;r=id[R]-1;
if(id[L]==id[R]) {printf("%d\n",R-L+1);continue;}
res=max(rr[L]-L+1,R-ll[R]+1);
// printf("\nleft:%d right:%d\n",l,r);
if(r>=l) res=max(res,RMQ(l,r));
printf("%d\n",res);
}
}
return 0;
}
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)