天天看點

【單調棧 && 右邊第一個比它大的數】SDUT 3333 資料結構實驗之棧與隊列六:下一較大值(二)

資料結構實驗之棧與隊列六:下一較大值(二)

Time Limit: 150MS Memory Limit: 8000KB

Submit Statistic

Problem Description

對于包含n(1<=n<=100000)個整數的序列,對于序列中的每一進制素,在序列中查找其位置之後第一個大于它的值,如果找到,輸出所找到的值,否則,輸出-1。

Input

輸入有多組,第一行輸入t(1<=t<=10),表示輸入的組數;

以後是 t 組輸入:每組先輸入n,表示本組序列的元素個數,之後依次輸入本組的n個元素。

Output

輸出有多組,每組之間輸出一個空行(最後一組之後沒有);

每組輸出按照本序列元素的順序,依次逐行輸出目前元素及其查找結果,兩者之間以–>間隔。

Example Input

2

4 12 20 15 18

5 20 15 25 30 6

Example Output

12–>20

20–>-1

15–>18

18–>-1

20–>25

15–>25

25–>30

30–>-1

6–>-1

思路:

我們要找目前元素的下一個比它大的值。我們可以用一個棧,保持單調遞減。如果通路到的元素,比棧頂元素大,那麼棧頂元素的下一個比它大的值就是通路的元素。直到棧頂元素比通路元素大,那麼通路元素入棧。開個結構體存下id就好了。
#include<bits/stdc++.h>
using namespace std;
struct node
{
    int data, id;
};
#define nn 100005
int a[nn], vis[nn];
int main()
{
    int T, n, i;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        stack<node> q;
        for(i = ; i < n; i++)
        {
            scanf("%d", &a[i]);
            while(!q.empty())//棧不為空
            {
                node t = q.top();
                if(t.data < a[i])//判斷棧頂元素 和 通路元素大小
                {
                    vis[t.id] = a[i];//棧頂元素小,棧頂元素下一個大于它的值就是通路元素
                    q.pop();
                }
                else break;
            }
            q.push((node){a[i], i});//入棧
        }
        while(!q.empty())//剩下的元素代表找不到下一個比它大的元素
        {
            node t = q.top();
            vis[t.id] = -;
            q.pop();
        }
        for(i = ; i < n; i++)//輸出
        {
            printf("%d-->%d\n", a[i], vis[i]);
        }
        printf("\n");
    }
}