去年CSP初赛,天佑栽了,因为他对位运算不熟悉。今年他希望自己不再有知识盲区,所以最近他在研究双向链表。
对于一个1到n的排列P(即1到n中每一个数在P中出现了恰好一次),令q[i]为第i个位置之前第一个比P[i]值更小的位置,如果不存在这样的位置,则q[i]=0。
举例来说,如果n=5且P为1 5 4 2 3,则q为0 1 1 1 4。
下列程序读入了排列P,使用双向链表求解了答案。试补全程序。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
struct node {
int a, L, R;
} f[N];
int n;
int main() {
cin >> n;
for (int i = 1; i <= n; ++i) {
int x;
cin >> x;
___(1)___;
f[i].L = i - 1;
___(2)___;
}
for (int i = n; i >= 1; --i) {
f[__(3)__].L = f[f[i].a].L;
f[f[f[i].a].L].R = __(4)__;
}
for (int i = 1; i <= n; ++i) {
cout << __(5)__ << " ";
}
cout << endl;
return 0;
}
(1) 第1空的答案为_________
A. f[i].a = x-1; B. f[x].a = i-1; C. f[i].a = x; D. f[x].a = i;
(2) 第2空的答案为_________
A. f[f[i].L].R = i+1; B. f[i].R = i+1; C. f[f[x].a].L = f[i-1].L; D. f[f[x].a].R = f[i+1].R;
(3) 第3空的答案为_________
A. f[i-1].a; B. f[i+1].a; C. f[f[f[i].a].L].R; D. f[f[i].a].R;
(4) 第4空的答案为_________
A. f[f[f[i].L].R].a; B. f[f[i].R].a; C. f[f[i].a].R; D. f[f[f[i].R].a].L;
(5) 第5空的答案为_________
A. f[f[i].a].L; B. f[i].R; C. f[f[i].a].R; D. f[i].L;
(6) 若输入为6 6 1 5 2 3 4,则输出为________
A. 0 0 0 0 0 0 B. 6 6 6 6 6 6 C. 0 0 2 2 4 5 D. 0 0 2 2 4 4
只需提交6个选项的答案,一行一个,均为大写字母。代码格式如下:
#include<iostream>
using namespace std;
int main()
{
cout<<"A\n";
cout<<"A\n";
cout<<"A\n";
cout<<"A\n";
cout<<"A\n";
cout<<"A\n";
return 0;
}