首页 > 代码库 > 板子4
板子4
主席树(求区间第K大)
int cnt, T[maxn]; struct Tree{ int l, r, val; } tre[maxn*40]; void init() { cnt = 0; } int build(int l, int r) { int nod = ++cnt; tre[nod].val = 0; if (l == r) return nod; int m = l + r >> 1; tre[nod].l = build(l, m); tre[nod].r = build(m+1, r); return nod; } int update(int pre, int l, int r, int val) { int nod = ++cnt; tre[nod] = tre[pre]; tre[nod].val++; if (l == r) return nod; int m = l + r >> 1; if (val <= m) tre[nod].l = update(tre[pre].l, l, m, val); else tre[nod].r = update(tre[pre].r, m+1, r, val); return nod; } int query(int v, int u, int l, int r, int k) { if (l == r) return l; int m = l + r >> 1; int num = tre[tre[u].l].val - tre[tre[v].l].val; //左边的数多少 if (num >= k) return query(tre[v].l, tre[u].l, l, m, k); else return query(tre[v].r, tre[u].r, m + 1, r, k - num); } int a[maxn], n, m, b[maxn]; void solve() { while (cin >> n >> m) { init(); for (int i = 1; i <= n; i++) { scanf("%d", a + i); b[i] = a[i]; } sort(b+1, b+1+n); int xx = unique(b+1, b+1+n) - (b + 1); //离散 T[0] = build(1, xx); //根节点 for (int i = 1; i <= n; i++) { int h = lower_bound(b+1, b+1+n, a[i]) - (b + 1); T[i] = update(T[i-1], 1, xx, h+1); } while (m--) { int l, r, k; scanf("%d%d%d", &l, &r, &k); printf("%d\n", b[query(T[l-1], T[r], 1, xx, k)]); } } }
板子4
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。