UVa 11235
来源:互联网 发布:淘宝鼠标滑动效果代码 编辑:程序博客网 时间:2024/04/27 17:36
#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int maxn=1000010;int n,q,a[maxn],x,y,d[maxn][20],values[maxn],counts[maxn],num[maxn],le[maxn],ri[maxn];vector<int> v;void RMQ_init(const vector<int>& v){ int n=v.size(); for(int i=0;i<n;i++) d[i][0]=v[i]; for(int j=1;(1<<j)<=n;j++) for(int i=0;i+(1<<j)-1<n;i++) d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);}int RMQ(int L,int R){ int k=0; while((1<<(1+k))<=R-L+1) k++; return max(d[L][k],d[R-(1<<k)+1][k]);}int main(){ while(scanf("%d",&n)!=EOF) { if(n==0) break; scanf("%d",&q); v.clear(); int kase=0; for(int i=0;i<n;i++) scanf("%d",&a[i]); a[n]=a[n-1]+1; for(int i=1;i<=n;i++) { if(a[i]!=a[i-1]) { v.push_back(i-kase); for(int j=kase;j<i;j++) { num[j]=v.size()-1; le[j]=kase; ri[j]=i-1; } kase=i; } } RMQ_init(v); for(int i=1;i<=q;i++) { int maxs=-100; scanf("%d%d",&x,&y); x--;y--; if(num[x]==num[y]) maxs=y-x+1; else { maxs=max(y-le[y]+1,maxs); maxs=max(ri[x]-x+1,maxs); if(num[x]+1<num[y]) { maxs=max(maxs,RMQ(num[x]+1,num[y]-1)); } } printf("%d\n",maxs); } } return 0;}
第一次学习到了关于RMQ的知识点,知识点还是很好理解的,但是这个题还是比较恶心的啊。不是很好写,一开始的num、left、right函数就不太好写,这里直接把重复的次数当作了vector里的元素压进去了,用的真的是十分的巧妙的,然后就是这个在写这里的代码的时候有一个问题就是关于下标是1开始0开始的问题,这个地方需要注意书上的模版里的是从0开始的。如果在自己的main函数里的设置最好是设置成0开始,特别是这个num也要从0开始标记。即不能是num[j]=v.size();而应该是num[j]=v.size()-1;才是正确的。然后下面的程序都是按照书上的的思路来。不过需要把模版里的min改成max即可,因为d数组里的值此时是从i开始长度为2<<j的一段元素里的最大重复次数。然后main里求maxs的就需要从LR同一段、LR分成连接的两段、以及LR分成分开的两段(L、R之间还有某些段)这三类进行分析即可。
看来RMQ的知识点也就是模版还是很好理解的。但是实际的题目的应用上还是有点难的。
0 0
- UVA 11235
- uva 11235
- UVA 11235
- UVa 11235
- UVa 11235 - Frequent values
- uva--11235--Frequent values
- UVA 11235 Frequent values
- UVa 11235 Frequent Values
- UVa-11235 - Frequent values
- UVA 11235 - Frequent values
- RMQ问题 UVa 11235
- UVa 11235 RMQ
- UVa:11235 Frequent values
- UVA 11235 RMQ问题
- Uva 11235 Frequent Values
- Uva 11235 (RMQ)
- UVA - 11235 Frequent values
- UVa 11235 Frequent values
- 正则表达式之非空白字符串
- Oracle建立表空间和用户
- 自己写的语句······笔记
- 订餐系统:技术不重要,技术很重要,设计最重要
- Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider
- UVa 11235
- Android开发之如何保证Service不被杀掉(broadcast+system/app)
- Boost环境详细编译步骤
- 脚本的执行流程分析
- clone方法 --深拷贝与浅拷贝
- 智博联反射波测桩分析软件 V141125专业版
- BZOJ 2595 [Wc2008]游览计划
- 杭电5256序列变换
- Linq的SequenceEqual妙用