poj2452
来源:互联网 发布:软件qa岗位职责 编辑:程序博客网 时间:2024/06/05 23:51
题意:给你一组数a[n],求满足a[i] < a[k] < a[j] (i <= k <= j)的最大的j-i。
解法一:先记录每一位数后面连续大于这个数的长度,然后再这个长度里找最大的数,这样可求得最大的区间
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>using namespace std;int main(){ int a[5005],dis[50005]; int n,maxn,flag,ans; while(scanf("%d",&n)!=EOF) { ans=0; for(int i=1;i<=n;i++) { cin>>a[i]; dis[i]=1; } dis[n+1]=-1; for(int i=n;i>=0;i--) { while(a[i]<a[i+dis[i]]) dis[i]+=dis[i+dis[i]]; } for(int i=1;i<=n;i+=flag+1) { maxn=flag=-1; for(int j=0;j<dis[i];j++) { if(a[i+j]>maxn) { maxn=a[i+j]; flag=j; } } if(flag>ans) ans=flag; } if(ans) printf("%d\n",ans); else printf("-1\n"); } return 0;}
解法二:
- RMQ + 二分。
- 枚举i,利用二分求出a[i]右边第一个小于a[i]的数的位置k,
- 再求出[i, k]中最大值的位置j,若a[j] > a[i],则更新结果。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int maxn = 50010; int n, len[maxn]; // 分别存储的是最大值和最小值的下标 int minl[maxn][20], maxl[maxn][20]; int _min(int l, int r) { if (len[l] < len[r]) return l; return r; } int _max(int l, int r) { if (len[l] > len[r]) return l; return r; } void init() { for (int i = 1; i <= n; ++i) minl[i][0] = maxl[i][0] = i; for (int j = 1; (1<<j) <= n; ++j) { for (int i = 1; i + (1<<j) - 1 <= n; ++i) { minl[i][j] = _min(minl[i][j-1], minl[i+(1<<(j-1))][j-1]); maxl[i][j] = _max(maxl[i][j-1], maxl[i+(1<<(j-1))][j-1]); } } } int minrmq(int l, int r) { int k = (int)(log(double(r) - l + 1) / log(2.0)); return _min(minl[l][k], minl[r+1-(1<<k)][k]); } int maxrmq(int l, int r) { int k = (int)(log(double(r) - l + 1) / log(2.0)); return _max(maxl[l][k], maxl[r+1-(1<<k)][k]); } int bsearch(int x, int l, int r) { while (l <= r) { if (l == r) return l; int m = (l + r) >> 1; if (len[x] < len[minrmq(l, m)]) l = m + 1; else r = m; } } void work() { int ans = 0; for (int i = 1; i + ans < n; ++i) { int r = bsearch(i, i + 1, n); int k = maxrmq(i, r); if(len[k] > len[i]) ans = max(ans, k - i); } if (ans == 0) printf("-1\n"); else printf("%d\n", ans); } int main() { while (scanf("%d", &n) != EOF) { for (int i = 1; i <= n; ++i) scanf("%d", &len[i]); init(); work(); } return 0; }
0 0
- poj2452
- poj2452
- POJ2452 Sticks Problem
- POJ2452 && BNU2571:Sticks Problem
- POJ2452 Sticks Problem
- poj2452——Sticks Problem
- POJ2452---Sticks Problem(单调栈+RMQ,方法不够优秀)
- 整数除法
- Looper、Handler与HandlerThread
- 【学习笔记】C语言 随机数的生成原理分析和各类随机数公式
- HDFS原理及其个元素功能
- php中的几个输出函数
- poj2452
- numpy 矩阵运算的陷阱
- 程序设计基石与实践专栏引导
- 三大框架学习之----struts2框架的搭建(一)
- A Bug's Life
- block与函数
- 安卓(android)生命周期的系统性总结以及实例演示
- Java设计模式之代理模式
- 国庆上课记录