poj 3368 RMQ(查询给定区间内频率最多的数字数量)
来源:互联网 发布:知乎上海生死劫电影 编辑:程序博客网 时间:2024/06/05 19:04
题意:给出n个数的非递减序列和Q个询问(l,r),对于每个询问求出(l,r)之间连续出现次数最多的次数。
思路:用RMQ。将原序列稍作转换。end数组存放与第i个数相同的最后一个数的下标(查找的时候保证O(1))。
#include <stdio.h>#include <string.h>#include <math.h>#define max(a,b) ((a)>(b)?(a):(b))#define N 100010int dp[N][20],s[N],t[N],end[N];int n,q;void st(){ int i,j,k=log((double)(n+1))/log(2.0); for(i = 1;i<=n;i++) dp[i][0] = t[i]; for(j = 1;j<=k;j++) for(i = 1;i+(1<<j)-1 <= n;i++) dp[i][j] = max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);}int query(int a,int b){ int k = log((double)b-a+1)/log(2.0); return max(dp[a][k],dp[b-(1<<k)+1][k]);}int main(){ while(scanf("%d",&n) && n){ int i,j,a,b; memset(t,0,sizeof(t)); scanf("%d",&q); for(i = 1;i<=n;i++) scanf("%d",&s[i]); end[n] = n; for(i = n-1;i>=1;i--) end[i] = (s[i]==s[i+1])?end[i+1]:i; for(t[1] = 1,i = 2;i<=n;i++) if(s[i] == s[i-1]) t[i] = t[i-1]+1; else t[i]++; st(); while(q--){ scanf("%d %d",&a,&b); if(end[a] >= b)//表示查询区间只有一种数字 j = b-a+1; else{ j = end[a]-a+1; j = max(j,query(end[a]+1,b)); } printf("%d\n",j); } } return 0;}
0 0
- poj 3368 RMQ(查询给定区间内频率最多的数字数量)
- POJ 3368 Frequent values(RMQ 区间出现频率最多数字次数)
- POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)
- POJ 3368 线段树,给定区间求连续不降序列的在该区间内出现最多的数
- rmq 求区间内出现次数最多的数字出现的次数!
- 【POJ 3368】【RMQ 或者 线段树】Frequent values【求出区间内连续出现次数最多的数的次数。】
- POJ 3368 区间数字出现最多次数
- poj 3368 统计区间出现次数最多数个数 RMQ
- 【POJ 3264】【RMQ 或者线段树】Balanced Lineup 【查询区间内最大最小值的差】
- poj 3286 给定区间内0出现的次数
- poj 3368 RMQ 求最多出现次数的数
- hdu 1806 Frequent values(给定一个非降序数组,求任意区间内出现次数最多的数的次数)
- 查询区间内不同数字的个数 lydsy1878
- RMQ 问题 POJ 3264 求解任意指定区间内的最小值和最大值
- hdu 5726 gcd rmq 求相同gcd的区间数量
- RMQ 区间查询
- POJ 3264 ST表(RMQ问题:查询区间最大最小值)
- mysql查询某个表中数量最多的字段
- 2014年终总结
- 【硬件整理】M15088A/BEG 8*8双色LED点阵 24脚
- 【HDU3535】AreYouBusy
- 搜索引擎三:搭建Nginx服务器
- POJ 1930 - Dead Fraction(数学)
- poj 3368 RMQ(查询给定区间内频率最多的数字数量)
- jquery键盘enter事件
- Array
- Java学习日记001_about疯狂Java讲义
- windows_VS2012为ExtJs智能提示
- get an array of arrays with unique elements
- RMQ
- CryptoPP32_DLL的COM组件版本
- Python爬虫/文本处理/科学计算/机器学习——工具包总结