Run ID | Author | Problem | Lang | Verdict | Score | Time | Memory | Code Length | Submit Time |
---|---|---|---|---|---|---|---|---|---|
346685 | admin_cgn | 【C6-8】二分查找右侧边界 | C++ | Accepted | 100 | 96 MS | 648 KB | 791 | 2025-09-11 14:10:36 |
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10; int a[N], n, q; // 返回 x 在 a[] 中最后一次出现的下标(1-base),不存在返回 -1 int lastPos(int x) { int l = 1, r = n; // 1-base while (l < r) { int mid = (l + r + 1) >> 1; // 模板 2 向上取整 if (a[mid] <= x) l = mid; // 答案在右半 [mid, r] else r = mid - 1; // 答案在左半 [l, mid-1] } // 循环结束后 l==r,再验证是否真的是 x return a[l] == x ? l : -1; } int main() { cin >> n; for (int i = 1; i <= n; ++i) scanf("%d",&a[i]); cin >> q; while (q--) { int x; scanf("%d",&x); printf("%d ",lastPos(x)); } return 0; }