UVA 11235 求区间连续数的众数 RMQ
来源:互联网 发布:淘宝网登陆页 编辑:程序博客网 时间:2024/04/30 14:22
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2176
题意:
给定n长的序列, query次询问
下面n个数表示询问
对于每次询问的区间,回答该区间连续相同的数 这样的段最长有多长
思路:
RMQ裸题
特判下左右端点然后中间部分RMQ即可
#include<stdio.h>#include<string.h>#include<math.h>#include<iostream>using namespace std;const int MAXN = 100100;int n,query;int A[MAXN];int FMin[MAXN][20],FMax[MAXN][20];void Init(){int i,j;for(i=1;i<=n;i++)FMin[i][0]=FMax[i][0]=A[i];for(i=1;(1<<i)<=n;i++){ //按区间长度递增顺序递推 for(j=1;j+(1<<i)-1<=n;j++){ //区间起点 FMin[j][i]=min(FMin[j][i-1],FMin[j+(1<<(i-1))][i-1]);FMax[j][i]=max(FMax[j][i-1],FMax[j+(1<<(i-1))][i-1]);}} }int Query(int l,int r){int k=(int)(log(double(r-l+1))/log((double)2));return max(FMax[l][k],FMax[r-(1<<k)+1][k]);}int num[MAXN], l[MAXN], r[MAXN];int main(){int i,j,a,b;while(scanf("%d",&n), n){scanf("%d",&query);int cnt = 1;int L = 1, R = 1;for(i=1;i<=n;i++){scanf("%d",&num[i]);if(num[i] == num[i-1] && i!=1){R++; cnt++;}if((i!=1 && num[i]!=num[i-1]) || i==n){for(j = L; j <= R; j++){A[j] = cnt;l[j] = L;r[j] = R;}cnt = 1;L = R = i;}}for(j = L; j <= n; j++)A[j] = cnt, l[j] = L, r[j] = n;Init();while(query--){scanf("%d %d",&a,&b); if(a>b)swap(a,b);L = r[a]; if(L>=b){printf("%d\n", b-a+1);continue;}R = l[b]; if(R<=a){printf("%d\n", b-a+1);continue;}int ans = max(L-a+1, b-R+1);if(L == R-1){printf("%d\n", ans);continue;}L++, R--;printf("%d\n", max( ans, Query(L,R)));}}return 0;}/*8 4-1 -1 1 1 1 1 3 102 31 18 81 81 111 12 31 21 11 22 20*/
0 0
- UVA 11235 求区间连续数的众数 RMQ
- 51Nod 1174 求区间最大的数 RMQ
- 区间众数:UVa 11235 - Frequent values
- (POJ3368)Frequent values <RMQ 求区间出现次数最多的数出现的次数>
- (POJ3368)Frequent values <RMQ 求区间出现次数最多的数出现的次数>
- 1174 区间中最大的数(RMQ)
- 1174 区间中最大的数 RMQ
- 区间中最大的数 RMQ
- 【POJ 3368】【RMQ 或者 线段树】Frequent values【求出区间内连续出现次数最多的数的次数。】
- 【解题报告】HDU 4638 Group - 树状数组 + 求一段区间连续数字的段数
- POJ 3368 线段树,给定区间求连续不降序列的在该区间内出现最多的数
- 关于求连续区间的最小公倍数
- 邮票面值,求最大的连续区间
- 求一段连续整数区间的和
- Uva 12299 线段树求区间最小值(RMQ) 区间查询单点更新
- UVA 1619 - Feel Good(dp 求区间最小值 附加RMQ)(区间最小值优化)
- poj 3419 Difference Is Beautiful (区间最长连续不重复数 dp+二分+RMQ)
- poj 3419 Difference Is Beautiful (区间最长连续不重复数 dp+二分+RMQ)
- POJ 4075 旋转矩阵
- 黑马程序员_IO2_File和Properties
- HDU4612
- ubuntu中配置DNS服务器 记录
- 指针遍历字符串—华为机试题
- UVA 11235 求区间连续数的众数 RMQ
- JSON网络数据传输的公共类
- 慎用List.subList方法
- 2012求职总结--marvell、qq、baidu
- hadoop使用中的几个小细节
- thinkPHP 模板输出
- 使用Web Service传输文件
- 夏令时【Daylight Saving Time】时间计算出错的解决办法
- PHP 获取当前页面各种URL