NOIP 2018 普及组初赛试题:对于一个
5 1 5 4 2 3
2 6 6 5 6
原题当然是程序完善,但我只想讲这个线性算法.
建双向链表,第 i 个节点的值是 a[i]
表示数字 i 在链表的位置.
这个算法改改就能算{之后/之前}最近的{更大/更小}值的位置.
#include <iostream>
const int N = 100010;
int n, L[N], R[N], a[N];
int main() {
using std::cin; cin >> n;
for (int i = 1, x; i <= n; ++i)
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)
std::cout << R[i] << " ";
std::cout << '\n';
}
单调队列,代码略。这个方法和