遇到一个不会做的题目,特此发布此问答
题目:
我的代码:
#include <iostream>
#include <vector>
#include <climits>
#include <cmath>
#include <algorithm>
#define int long long
using namespace std;
const int MAXN = 1e5 + 5;
int tree[4 * MAXN];
vector<int> nums;
void build(int node, int start, int end) {
if (start == end) {
tree[node] = nums[start];
} else {
int mid = (start + end) / 2;
build(2 * node, start, mid);
build(2 * node + 1, mid + 1, end);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
}
int queryClosestLarger(int node, int start, int end, int idx, int val) {
if (start == end) {
return tree[node];
}
int mid = (start + end) / 2;
if (idx <= mid) {
return queryClosestLarger(2 * node, start, mid, idx, val);
} else {
int rightResult = queryClosestLarger(2 * node + 1, mid + 1, end, idx, val);
int leftMax = tree[2 * node];
if (abs(val - leftMax) <= abs(val - rightResult)) {
return leftMax;
} else {
return rightResult;
}
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
nums.resize(n);
for (int i = 0; i < n; ++i) {
cin >> nums[i];
}
build(1, 0, n - 1);
for (int i = 1; i < n; ++i) {
cout << queryClosestLarger(1, 0, n - 1, i - 1, nums[i]) << " ";
}
cout << endl;
return 0;
}