2019牛客暑期多校训练1

Equivalent Prefixes

这个是一个用单调栈的题目,至于为什么可以用单调栈?

把两个数组同时跑单调栈,如果每次进栈最多一个,当然在这个进栈之前肯定会有数出栈,

如果存在一个数进栈了,然后这个时候判断一下进栈的这个数的位置是不是相同,如果不相同就说明肯定是不对的。

为什么说这个时候只要考虑这个栈内的位置呢?

首先,这个最小值之前的数肯定是不要考虑的,因为当前的栈底就是目前位置最小的了,之后的数和之前的数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;
}
A

猜你喜欢

转载自www.cnblogs.com/EchoZQN/p/11246775.html