定一个含 N 个不相同数字的数组,在最坏情况下,找出其中最大或最小的数,至少需要 N-1比较操作。则最坏情况下,在该数组中同时找最大与最小的数至少需要( )次比较操作。(⌈⌉ 表示向上取整⌊⌋ 表示向下取整)。
偶数先比较前两个数,作为最大值和最小值的初始值,需要一次比较次数。
奇数将第一个元素作为最大值和最小值的初始值。
再以两个数为一组,首先比较这两个数的大小,然后分别与当前最小值和最大值比较。
由四个没有区别的点构成的简单无向连通图的个数是( )。
三条边的图有两个(长为 33 的路、星图)。
四条边的图有两个(圈、三角形加一条边)。
五条边的图有一个(完全图挖掉一条边)。
六条边的图有一个(即 44 个点的完全图)。
include [HTML_REMOVED]
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;
① ;
}
for (int i = 1; i <= n; i) {
R[i] = ② ;
L[i] = i - 1;
}
for (int i = 1; i <= n; i) {
L[ ③ ] = L[a[i]];
R[L[a[i]]] = R[ ④ ];
}
for (int i = 1; i <= n; i) {
cout << ⑤ << ” “;
}
cout << endl;
return 0;
}
考察双向链表的基本操作。程序按照 xx 的值从 11 到 nn 枚举每个值,依次在双向链表中删除该点,删除的时候就可以知道该值左边最近比它大元素的位置和右边最近比它大元素的位置。
第 ① 空是 a 数组的初始化操作,标记每个值的位置,所以需要填 a[x] = i。
第 ② 空是双向链表指针的初始化操作,右指针指向右边相邻的元素,所以需要填 i + 1。
第 ③④ 空是双向链表的删除操作,当前元素右边元素的左指针需要指向左边元素,左边元素的右指针需要指向右边元素,所以分别填 R[a[i]] 和 a[i]。
最后需要输出答案,即 R[i] 的值,所以第 ⑤ 空需要填 R[i]。