滑蒻稽的博客

NOIP 2018 初赛第二道完善程序题分析

2. 对于一个1到n的排列p(即1到n中每一个数在p中出现了恰好一次),令qi为第i个位置之后第一个比pi值更大的位置,如果不存在这样的位置,则qi =n+1。

举例来说,如果n=5且p为1 5 4 2 3,则q为2 6 6 5 6。

下列程序读入了排列p,使用双向链表求解了答案。试补全程序。(第二空2分,其余3分)

数据范围 1 ≤ n ≤ 105

#include<iostream>

using namespace std;

const int N =100010;

int n;

int L[N], R[N],a[N];

int main() {

    cin >> n;

    for (int i = 1; i <= n; ++i) {

        int x;

        cin >> x;

        a[x] = i;

    }

    for (int i = 1; i <= n; ++i) {

        R[i]= i + 1 ;

        L[i] = i - 1;

    }

    for (int i = 1; i <= n; ++i) {

        L[ R[a[i]]]= L[a[i]];

        R[L[a[i]]] = R[ a[i]];

    }

    for (int i = 1; i <= n; ++i) {

        cout <<R[i]<<" ";

    }

    cout << endl;

    return 0;

}

 

1.第一空,记录a数组,由于1到n都只出现一次,所以记录该数出现的下标

2.第二个for循环,初始化R和L数组。双向链表所以有前驱和后继,初始化成i-1和i+1

3.先看看每个数组的情况

i 0 1 2 3 4 5

a 0 1 4 5 3 2

R 0 2 3 4 5 6

L 0 0 1 2 3 4

 

再进入for循环模拟

posted @ 2019-10-18 21:18  huaruoji  阅读(701)  评论(0编辑  收藏  举报