第三章例题8 (频繁出现的数值)RMQ
来源:互联网 发布:做美工需要学什么 编辑:程序博客网 时间:2024/06/06 19:11
给你长度为n的非递减数组,m次询问,问[l,r]内出现最多的值所出现的次数。 可交题的链接
题解:
真是好题,书上刚讲了RMQ,然后给出这道题,我一看两者也没啥联系啊,后来才知道,通过变化, 就是一道RMQ题。
因为是非递减的,所以相等的元素一定是连续出现的,然后我们记录每个连续块的数值(value),长度(coun),左端点(lef),右端点(righ),以及每个数属于哪个连续块(num)。然后coun上做RMQ,对于每一次询问(L,R),如果L,R属于同一个连续块,则长度问R-L+1,否则,如果L,R之间有超过两个连续块,就得RMQ求一下,区间最值,然后再判断,不完整区间的长度。取最大即可
代码:
#include <stdio.h>#include <stdlib.h>#include <iostream>#include <string.h>#include <math.h>#define ll long longusing namespace std;const int maxn=1e5+10;int maxnum[maxn][50];int value[maxn];int coun[maxn];int lef[maxn];int righ[maxn];int num[maxn];int a[maxn];void RMQ(int num){ for(int i=1; i<=num; i++) { maxnum[i][0]=coun[i]; } for(int j=1; j<20; j++) { for(int i=1; i<=num; i++) { if(i+(1<<j)-1<=num) { maxnum[i][j]=max(maxnum[i][j-1],maxnum[i+(1<<(j-1))][j-1]); // minnum[i][j]=min(minnum[i][j-1],minnum[i+(1<<(j-1))][j-1]); } } }}int remax(int st,int en){ int k=(int)((log(en-st+1))/log(2.0)); return max(maxnum[st][k],maxnum[en-(1<<k)+1][k]);}int n,m,l,r;int main(){ while(~scanf("%d",&n)) { if(!n)break; scanf("%d",&m); int len=1; memset(a,0,sizeof(a)); scanf("%d",&a[1]); value[len]=a[1]; coun[len]=1; num[1]=len; lef[len]=1; for(int i=2; i<=n; i++) { scanf("%d",&a[i]); if(a[i]==a[i-1]) { coun[len]++; num[i]=len; } else { righ[len]=i-1; len++; value[len]=a[i]; coun[len]=1; num[i]=len; lef[len]=i; } } RMQ(len); while(m--) { scanf("%d%d",&l,&r); if(num[l]==num[r]) { printf("%d\n",r-l+1); } else { int ans=0; if(num[l]+1<=num[r]-1) { ans=remax(num[l]+1,num[r]-1); } ans=max(ans,max(righ[num[l]]-l+1,r-lef[num[r]]+1)); printf("%d\n",ans); } } }}
0 0
- 第三章例题8 (频繁出现的数值)RMQ
- UVA - 11235 Frequent values 频繁出现的数值(RMQ)
- UVa 11235 频繁出现的数值(RMQ)
- RMQ,ST表(频繁出现的数值,UVA 11235)
- 例题3.8 频繁出现的数值 UVa11235
- Uva 11235 频繁出现的数值(RMQ-Sparse Table 算法)(训练指南)
- POJ 3368—— Frequent values(频繁出现的数值UVA11235) RMQ
- 频繁出现的数值
- UVA - 11235 Frequent values 频繁出现的数值 RMQ+游程编码
- UVa 11235 频繁出现的数值
- 指南第三章 例题八 UVA 11235 Frequent values(RMQ问题)
- 巴蜀oj1939(RMQ 的例题 )
- 频繁出现的UAC
- 第三章例题
- POJ 3368-Frequent values(RMQ+离散化-最频繁的元素)
- RMQ学习总结(附带简单例题)
- 数值分析 第三章 线性方程组的迭代法
- RMQ(模板 ST 区间最值,区间频繁次数)
- 第五天总结
- 弱校联萌第三场 I 数位dp 好题,可以用来入门
- Android Studio使用AIDL时无法找到自定义的类
- UmBasketella(弱校联盟十一专场)
- 1.1.1. Atitit Cocos2d-JS v3.x的问题
- 第三章例题8 (频繁出现的数值)RMQ
- Spring事务回滚策略
- Android Studio新建AIDL
- QT5(6)对话框
- atitit.事件驱动的总结attilax
- leetCode_线段树、单点更新、区间求和
- JavaScript对象的属性详解
- atitit.js浏览器环境下的全局异常捕获
- sql盲注入 python