Frequent values

来源:互联网 发布:java中重载的用法 编辑:程序博客网 时间:2024/05/16 03:00

http://poj.org/problem?id=3368


#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <cmath>using namespace std;const int maxn=100005;int f[maxn][18];int a[maxn],l[maxn],r[maxn],num[maxn];int v,ans;void st(vector<int>&shu){int k;k=(int)((log(1.0*shu.size()))/log(2.0));for(int i=0;i<shu.size();i++)f[i][0]=shu[i];for(int j=1;j<=k;j++){for(int i=0;i+(1<<j)-1<shu.size();i++){f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);}}}int sou(int zuo,int you){int k;k=(int)((log(1.0*(you-zuo+1)))/log(2.0));int ans= max(f[zuo][k],f[you-(1<<k)+1][k]);return ans;}int main(int argc, char *argv[]){int n,q;while(scanf("%d",&n)==1&&n){scanf("%d",&q);for(int i=0;i<n;i++)scanf("%d",&a[i]);int be;a[n]=a[n-1]+1;vector<int> shu;for(int i=0;i<=n;i++)if(i==0||a[i]>a[i-1]){if(i>0){shu.push_back(i-be);for(int j=be;j<i;j++){num[j]=shu.size()-1;l[j]=be; r[j]=i-1;}}be=i;}st(shu);int zuo,you;while(q--){scanf("%d%d",&zuo,&you);zuo--; you--;if(num[zuo]==num[you]){ans=you-zuo+1;}else{ans=max(r[zuo]-zuo+1,you-l[you]+1);if(num[zuo]+1<num[you])ans=max(ans,sou(num[zuo]+1,num[you]-1));}printf("%d\n",ans);}}return 0;}


0 0
原创粉丝点击