hdu 1806 Frequent values(给定一个非降序数组,求任意区间内出现次数最多的数的次数)
2015-08-06 15:51
561 查看
1.题目解析可见《训练指南》P198
2代码:
2代码:
#include<cstdio> #include<cstring> #include<cmath> #define Min(a,b) ((a)<(b)?(a):(b)) #define Max(a,b) ((a)>(b)?(a):(b)) #define N 100005 #define INF 1<<30 using namespace std; int a ; int value ,cnt ,num ,L ,R ; int ST [20]; int n,q; int k; void make_ST()//对cnt[]预处理 { for(int i=1;i<=k;i++) { ST[i][0]=cnt[i]; } for(int j=1;(1<<j)<=n;j++) { for(int i=1;(i+(1<<j)-1)<=n;i++) { ST[i][j]=Max(ST[i][j-1],ST[i+(1<<(j-1))][j-1]); } } } int Query(int l,int r) { if(l>r) return 0; else { int kk=floor(log2(r-l+1)); return Max(ST[l][kk],ST[r-(1<<kk)+1][kk]); } } int main() { while(scanf("%d",&n)&&n) { scanf("%d",&q); k=0; value[0]=INF; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(a[i]!=value[k]) { R[k]=i; value[++k]=a[i]; L[k]=i-1; cnt[k]=1; num[i]=k; } else { cnt[k]++; num[i]=num[i-1]; } } R[k]=n+1; make_ST(); while(q--) { int l,r; scanf("%d%d",&l,&r); if(num[l]==num[r]) { printf("%d\n",r-l+1); } else { int tmp=Max(R[num[l]]-l,r-L[num[r]]); int ans=Max(tmp,Query(num[l]+1,num[r]-1)); printf("%d\n",ans); } } } return 0; }
相关文章推荐
- 《深入理解Android 卷III》第二章 深入理解Java Binder和MessageQueue
- Codeforces Round #257 (Div. 2) B Jzzhu and Sequences
- 如何关闭AlertDialog.Builder对话框
- Java:String、StringBuffer和StringBuilder的区别
- android ormlite queryBuilder.where() 多条件
- iOS学习之UITabBarController简单介绍
- The method setProgress(int, int, boolean) is undefined for the type NotificationCompat.Builder
- custom UITableViewCell selected Color
- Juicer模板引擎
- -[UIKBBlurredKeyView candidateList]: unrecognized selector sent to instance 0x177cc850
- iOS UI06_UIPageControl
- iOS开发系列--UITableView全面解析
- iOS UI06_UIScorollView
- [LeetCode] Unique Binary Search Trees
- js 获取select标签的value 和 text
- UITextFild功能大全
- Blueprint的环境管理器
- Android UI学习之ListView(使用ArrayAdapter和SimpleAdapter)
- 社工数据搜索引擎搭建 - Build Social Engineer Evildata Search Engine
- OS开发UI篇—CAlayer(自定义layer)