题目是区间查询第一个大于等于 k 的数字,单点修。
namespace SGT {
int res[800001];
#define ls(p) (p << 1)
#define rs(p) (p << 1 | 1)
void update(int i, int l, int r, int qpos, int k) {
if (l > qpos || r < qpos) return;
int mid = (l + r) / 2;
if (l == r) {
res[i] = k;
return;
}
update(ls(i), l, mid, qpos, k);
update(rs(i), mid + 1, r, qpos, k);
res[i] = max(res[ls(i)], res[rs(i)]);
}
int query(int i, int l, int r, int ql, int qr, int k) {
if (l > qr || r < ql) return 1 << 30;
if (l >= ql && r <= qr) {
if (res[i] < k) return 1 << 30;
while (1) {
if (l == r) return l;
int mid = (l + r) / 2;
if (res[ls(i)] >= k) {
i = ls(i);
r = mid;
} else {
i = rs(i);
l = mid + 1;
}
}
}
int mid = (l + r) / 2;
return min(query(ls(i), l, mid, ql, qr, k), query(rs(i), mid + 1, r, ql, qr, k));
}
}
n 是一个常量,不超过 106,x,y 是在 [1,n] 之间的一个量,k 是在 [0,109] 之间的。我们可能会在之前调用了一些符合实际的 update 函数,试分析 query(1,1,n,min(x,y),max(x,y),k) 的最劣时间复杂度以及其常数。
上面一句话的最后一个短句就是我的问题,不是让你调试代码。 x