POJ2452---Sticks Problem(单调栈+RMQ,方法不够优秀)
来源:互联网 发布:js 获取file文件路径 编辑:程序博客网 时间:2024/06/04 19:43
Description
Xuanxuan has n sticks of different length. One day, she puts all her sticks in a line, represented by S1, S2, S3, …Sn. After measuring the length of each stick Sk (1 <= k <= n), she finds that for some sticks Si and Sj (1<= i < j <= n), each stick placed between Si and Sj is longer than Si but shorter than Sj.
Now given the length of S1, S2, S3, …Sn, you are required to find the maximum value j - i.
Input
The input contains multiple test cases. Each case contains two lines.
Line 1: a single integer n (n <= 50000), indicating the number of sticks.
Line 2: n different positive integers (not larger than 100000), indicating the length of each stick in order.
Output
Output the maximum value j - i in a single line. If there is no such i and j, just output -1.
Sample Input
4
5 4 3 6
4
6 5 4 3
Sample Output
1
-1
Source
我先用一个单调栈,找出每个值
然后rmq求出这个区间里的最小值
感觉
/************************************************************************* > File Name: POJ2452.cpp > Author: ALex > Mail: zchao1995@gmail.com > Created Time: 2015年05月15日 星期五 17时12分22秒 ************************************************************************/#include <functional>#include <algorithm>#include <iostream>#include <fstream>#include <cstring>#include <cstdio>#include <cmath>#include <cstdlib>#include <queue>#include <stack>#include <map>#include <bitset>#include <set>#include <vector>using namespace std;const double pi = acos(-1.0);const int inf = 0x3f3f3f3f;const double eps = 1e-15;typedef long long LL;typedef pair <int, int> PLL;static const int N = 50010;int arr[N];PLL Stack[N];int Top;int L[N];int dp[N][20];int _hash[N << 1];int LOG[N];void initRMQ(int n) { for (int i = 1; i <= n; ++i) { dp[i][0] = arr[i]; } for (int j = 1; j <= LOG[n]; ++j) { for (int i = 1; i + (1 << j) - 1 <= n; ++i) { dp[i][j] = min(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]); } }}int ST(int l, int r) { int k = LOG[r - l + 1]; return min(dp[l][k], dp[r - (1 << k) + 1][k]);}int main() { int n; LOG[0] = -1; for (int i = 1; i <= 50000; ++i) { LOG[i] = (i & (i - 1)) ? LOG[i - 1] : LOG[i - 1] + 1; } while (~scanf("%d", &n)) { for (int i = 1; i <= n; ++i) { scanf("%d", &arr[i]); _hash[arr[i]] = i; } initRMQ(n); int ans = -1; Top = 0; for (int i = n; i >= 1; --i) { if (!Top) { Stack[++Top] = make_pair(arr[i], i); } else { while (Top) { PLL u = Stack[Top]; if (u.first > arr[i]) { break; } --Top; L[u.second] = i + 1; } Stack[++Top] = make_pair(arr[i], i); } } while (Top) { PLL u = Stack[Top]; --Top; L[u.second] = 1; } for (int i = 1; i <= n; ++i) { int l = L[i]; if (l == i) { continue; } int p = _hash[ST(l, i)]; ans = max(ans, i - p); } printf("%d\n", ans); } return 0;}
- POJ2452---Sticks Problem(单调栈+RMQ,方法不够优秀)
- POJ2452 Sticks Problem
- POJ2452 && BNU2571:Sticks Problem
- POJ2452 Sticks Problem
- poj2452——Sticks Problem
- poj 2452 RMQ(Sticks Problem)
- Sticks Problem (单调队列)
- Sticks Problem--(单调队列)
- POJ 2452 Sticks Problem [RMQ+二分]
- POJ 2452 Sticks Problem(二分+RMQ)
- POJ 2452 Sticks Problem(二分+RMQ)
- POJ 2452 Sticks Problem(RMQ+二分)
- poj-2452 Sticks Problem(二分+RMQ)
- POJ 2452 Sticks Problem (RMQ + 预处理)
- 单调栈/单调队列/RMQ
- poj2452
- poj2452
- Sticks Problem
- 冒泡排序算法
- 敲响警钟:反编译apk文件
- android网络编程的访问类型
- 用java开发学生信息管理系统(SIMS,二)
- Python:Tkinter之Radiobutton
- POJ2452---Sticks Problem(单调栈+RMQ,方法不够优秀)
- 记一次内存优化的分享
- c#第四次作业
- Android开发好还是J2EE好
- 解密系列(基础篇_必备知识)
- Android 判断横竖屏幕以及设置横竖屏幕的方法
- VirtualBox下安装Openstack
- 安装ios开发环境
- 多线程基础总结