UVA 11235 Frequent Value RMQ
来源:互联网 发布:软件资格水平考试成绩 编辑:程序博客网 时间:2024/06/07 15:42
题意:给出非降序排列的数组a1,a2,a3.询问区间l,r内出现次数最多的值的出现的次数。
思路:求区间最大值,我们可以利用RMQ。
因为是非降序排列的,那所有相同的元素将聚在一起,这样,我们就能进行游程编码,即记录每个数出现的次数,开始的位置和结束的位置。
对于每次查询,我们就可以将l,r映射到对应区间,查询区间的RMQ。
代码如下:
#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int MAX = 1001000;int N,Q;int L,R;int sz;int a[MAX],left[MAX],right[MAX],s[MAX];int p[MAX];int d[MAX][20];void rmq_init(int n){ for(int i = 1; i <= n; ++i) d[i][0] = s[i]; for(int j = 1; (1<<j) <= n; ++j) for(int i = 1; i + (1<<j) - 1 <= n; ++i) d[i][j] = max(d[i][j-1],d[i + (1<<(j-1))][j-1]);}int rmq_query(int l, int r){ if(l > r ) return 0; int k = 0; while((1<<(k+1)) <= r - l + 1) k++; return max(d[l][k],d[r - (1<<k) + 1][k]);}int query(int l, int r){ if(a[l] == a[r]) return r - l + 1; int ans = max(r - left[a[r]] + 1,right[a[l]] - l + 1); return max(rmq_query(a[l]+1,a[r]-1),ans);}int main(void){ //freopen("input.txt","r",stdin); while(scanf("%d", &N),N){ scanf("%d", &Q); for(int i = 1; i <= N; ++i) scanf("%d", &a[i]); sz = 1; memset(s,0,sizeof(s)); int num = a[1]; left[sz] = 1; for(int i = 1; i <= N; ++i) if(num == a[i]){ s[sz]++; a[i] = sz; } else{ right[sz] = i-1; num = a[i]; s[++sz]++; left[sz] = i; a[i] = sz; } right[sz] = N; rmq_init(sz); for(int i = 0; i < Q; ++i){ scanf("%d %d", &L,&R); printf("%d\n",query(L,R)); } } return 0;}
0 0
- UVA 11235 Frequent Value RMQ
- UVA 11235 Frequent Values ---RMQ
- UVa 11235 Frequent values(RMQ)
- UVA 11235 - Frequent values(RMQ)
- uva 11235 Frequent values RMQ
- uva 11235 - Frequent values(RMQ)
- UVA 11235 Frequent values RMQ
- 【RMQ】 UVA 11235 Frequent values
- UVA 11235 Frequent values (RMQ)
- UVA 11235 Frequent values (RMQ)
- [RMQ]UVa 11235 - Frequent values
- UVa 11235 Frequent values (RMQ)
- UVA 11235 Frequent values(RMQ)
- UVA 11235 Frequent values(RMQ)
- UVa - 11235 - Frequent values(RMQ)
- uva 11235 - Frequent values(RMQ问题)
- POJ 3368 Frequent values (UVA 11235)(RMQ)
- UVA 11235 Frequent values(RMQ)
- Android Facebook like Custom ListView Feed using Volley
- html和xml中的空格问题
- IntelliJ Idea --------erlang
- opensaml parser
- 存储单位换算
- UVA 11235 Frequent Value RMQ
- “你当然是个胆小鬼。”昆仑叶哲华骄傲地说道
- JS内建方法
- IOCP模型与网络编程
- ubuntu下挂载windows分区
- linux下zip命令打包与解包
- IntelliJ Idea 常用快捷键列表
- 虚拟机
- 发个电饭锅地方个电饭锅地方个电饭锅