这个是一个用单调栈的题目,至于为什么可以用单调栈?
把两个数组同时跑单调栈,如果每次进栈最多一个,当然在这个进栈之前肯定会有数出栈,
如果存在一个数进栈了,然后这个时候判断一下进栈的这个数的位置是不是相同,如果不相同就说明肯定是不对的。
为什么说这个时候只要考虑这个栈内的位置呢?
首先,这个最小值之前的数肯定是不要考虑的,因为当前的栈底就是目前位置最小的了,之后的数和之前的数RMQ函数返回的函数值肯定是这个栈底。
然后就是考虑栈内元素,这个应该很好想了。
#include <cstdio>//描述中的“如果找到,就说“X,let’s fly”(此处,X为开始时间)…" #include <cstdlib>//和Output中的 “X, let's fly” #include <cstring>//里的“ ’ ”和 “ ' ” 不是一个符号,别复制错了!!! #include <queue> #include <vector> #include <algorithm> #include <string> #include <stack> #include <iostream> #include <map> #define inf 0x3f3f3f3f #define inf64 0x3f3f3f3f3f3f3f3f using namespace std; const int maxn = 1e5 + 10; typedef long long ll; int queue_mina[maxn]; int queue_minb[maxn]; int a[maxn], b[maxn]; int main() { int n; while(scanf("%d",&n)!=EOF) { bool flag = 1; int ans = n; for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= n; i++) scanf("%d", &b[i]); int f1 = 1, t1 = 0; int f2 = 1, t2 = 0; int r = 1; while(r<=n) { while (f1 <= t1 && a[r] < a[queue_mina[t1]]) t1--; queue_mina[++t1] = r; while (f2 <= t2 && b[r] < b[queue_minb[t2]]) t2--; queue_minb[++t2] = r; //printf("t1=%d t2=%d queue_mina[%d]=%d queue_minb[%d]=%d\n", t1, t2, t1, queue_mina[t1], t2, queue_minb[t2]); if (t1 != t2) { flag = 0; ans = r - 1; break; } r++; } printf("%d\n", ans); } return 0; }