关于在线段树上面的二分的时间复杂度
  • 板块学术版
  • 楼主CuteChat
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/6/5 15:54
  • 上次更新2024/6/5 18:44:14
查看原帖
关于在线段树上面的二分的时间复杂度
726525
CuteChat楼主2024/6/5 15:54

题目是区间查询第一个大于等于 kk 的数字,单点修。

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)); 
	}
}

nn 是一个常量,不超过 10610^{6},x,yx,y 是在 [1,n][1,n] 之间的一个量,kk 是在 [0,109][0,10^9] 之间的。我们可能会在之前调用了一些符合实际的 update⁡\operatorname{update} 函数,试分析 query⁡(1,1,n,min⁡(x,y),max⁡(x,y),k)\operatorname{query}(1,1,n,\min(x,y), \max(x,y), k) 的最劣时间复杂度以及其常数。

上面一句话的最后一个短句就是我的问题,不是让你调试代码。 x

2024/6/5 15:54
加载中...