指南第三章 例题八 UVA 11235 Frequent values(RMQ问题)
2016-08-31 13:13
543 查看
题目链接:http://7xjob4.com1.z0.glb.clouddn.com/31eeaedd10d813ea386928151f516e8a
中文题意:
给出一个非降序排列的整数数组a1,a2,…….,an。你的任务是对于一系列询问(i,j),回答ai,ai+1,…….aj中出现次数最多的值所出现的次数。
【输入格式】
输入包含多组数据。每组数据第一行为两个整数n和q(1<=n,q<=100000)。第二行包含n个非降序排列的整数a1,a2,……an(-100000<=ai<=100000)。以下q行每行包含两个整数i和j(1<=i<=j<=n),输入结束标志位n=0。
【输出格式】
对于每个查询,输出查询结果。
【分析】
RMQ算法,需要转化,把连着的数的起点,终点和长度记录下。
然后转化为RMQ问题就OK了。
中文题意:
给出一个非降序排列的整数数组a1,a2,…….,an。你的任务是对于一系列询问(i,j),回答ai,ai+1,…….aj中出现次数最多的值所出现的次数。
【输入格式】
输入包含多组数据。每组数据第一行为两个整数n和q(1<=n,q<=100000)。第二行包含n个非降序排列的整数a1,a2,……an(-100000<=ai<=100000)。以下q行每行包含两个整数i和j(1<=i<=j<=n),输入结束标志位n=0。
【输出格式】
对于每个查询,输出查询结果。
【分析】
RMQ算法,需要转化,把连着的数的起点,终点和长度记录下。
然后转化为RMQ问题就OK了。
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> using namespace std; const int N=1e5+9; struct RMQ//其实是把最小值变为最大值,原理一样 { int d [20]; void init(const vector<int>& A)//A[i]表示连着的数的个数 { int n=A.size(); for(int i=0;i<n;i++) { d[i][0]=A[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 query(int L,int R)//找出LR之间的最大值 { int k=0; while((1<<(k+1))<=R-L+1) k++; return max(d[L][k],d[R-(1<<k)+1][k]); } }; int a ,num ,l ,r ; int n,q,L,R,ans; RMQ rmq; int main() { while(scanf("%d",&n)&&n!=0) { scanf("%d",&q); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } a[0]=a[1]; a[n+1]=a +1;//预处理 int start=1; vector<int>cnt; for(int i=1;i<=n+1;i++)//用三个数组对题目进行转化。 { if(a[i]>a[i-1]) { cnt.push_back(i-start); for(int j=start;j<i;j++) { num[j]=cnt.size()-1;//j是第几个区间 l[j]=start;//区间的左端点 r[j]=i-1;//区间的右端点 } start=i; } } rmq.init(cnt); while(q--) { scanf("%d%d",&L,&R);//把L,R进行转化 if(num[L]==num[R]) ans=R-L+1; else { ans=max(R-l[R]+1,r[L]-L+1); if(num[L]+1<num[R]) { ans=max(ans,rmq.query(num[L]+1,num[R]-1));//查找对应的最大值 } } printf("%d\n",ans); } } return 0; }
相关文章推荐
- Uva 11235 Frequent values (RMQ问题 STable算法的应用)
- uva 11235 - Frequent values(RMQ问题)
- Frequent Values(UVa 11235) RMQ问题
- Uva 11235 Frequent values 【RMQ问题】
- 【RMQ】 UVA 11235 Frequent values
- UVA 11235 Frequent Values ---RMQ
- ST算法解决RMQ问题及UVA 11235题解
- UVA 11235 Frequent values 非递减序列 l r范围内 出现最多的数字次数 RMQ
- UVA 11235 - Frequent values(RMQ)
- UVA - 11235 Frequent values RMQ问题
- uva 11235 Frequent Values(游程编码, RMQ)
- 《算法竞赛-训练指南》第三章-3.8_UVa 11235
- UVa 11235 / POJ 3368 Frequent values (想法题&RMQ线段树维护最长区间长度)
- UVA 11235 RMQ问题
- UVA - 11235 - Frequent values (RMQ)
- UVA 11235 Frequent values RMQ
- UVA 11235 经典RMQ问题
- POJ 3368 Frequent values (UVA 11235)(RMQ)
- UVA 11235 Frequent values(RMQ)
- UVa 11235 Frequent Values(RMQ,ST算法)