当前位置: 首页 > news >正文

【第K小数——可持久化权值线段树】

题目

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;

int a[N], b[N];
int n, m, len;
int rt[N], idx; // idx 是点分配器

struct node
{
    int l, r;
    int s;
} tr[N * 22];

int getw(int x)
{
    return lower_bound(b + 1, b + len + 1, x) - b;
}

int build(int l, int r)
{
    int p = ++idx;
    tr[p].s = 0; // 初始化 s

    if (l < r)
    {
        int mid = l + r >> 1;
        tr[p].l = build(l, mid);
        tr[p].r = build(mid + 1, r);
    }
    return p;
}

int insert(int x, int l, int r, int v)
{
    int p = ++idx;
    tr[p] = tr[x];
    tr[p].s++; // 更新 s

    if (l < r)
    {
        int mid = l + r >> 1;
        if (v <= mid) tr[p].l = insert(tr[x].l, l, mid, v);
        else tr[p].r = insert(tr[x].r, mid + 1, r, v);
    }
    return p;
}

int query(int x, int y, int l, int r, int k)
{
    if (l == r) return l;

    int mid = l + r >> 1;
    int s = tr[tr[x].l].s - tr[tr[y].l].s; // 左子树的节点数
    if (k <= s) return query(tr[x].l, tr[y].l, l, mid, k);
    else return query(tr[x].r, tr[y].r, mid + 1, r, k - s);
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]), b[i] = a[i];

    sort(b + 1, b + n + 1);
    len = unique(b + 1, b + n + 1) - b - 1; // 初始化全局变量 len

    rt[0] = build(1, len); // 使用 len 作为区间范围
    for (int i = 1; i <= n; i++)
        rt[i] = insert(rt[i - 1], 1, len, getw(a[i])); // 更新 rt[i]

    while (m--)
    {
        int l, r, k;
        scanf("%d%d%d", &l, &r, &k);
        printf("%d\n", b[query(rt[r], rt[l - 1], 1, len, k)]); // 映射回 b,相对大小(位置)映射回实际大小
    }
    return 0;
}

相关文章:

  • IIS 服务器日志和性能监控
  • 蓝桥杯嵌入式赛道复习笔记2(按键控制LED灯,双击按键,单击按键,长按按键)
  • element-plus中Popconfirm气泡确认框组件的使用
  • 基于 Docker 和 Flask 构建高并发微服务架构
  • UnitTest框架管理测试用例——python自动化测试
  • Golang学习笔记_49——解释器模式
  • mysql-查看binlog日志
  • 基于SpringBoot+Vue的幼儿园管理系统+LW示例参考
  • GPU视频编解码:Jetson VPI+multimedia_api视频编解码入门(一)
  • Effective C++ 剖析(条款1~9)
  • 【软件工程】03_软件需求分析
  • 速通大厂测开
  • 介绍如何使用Python构建引文网络,并计算结构洞指标
  • 深入解析 `SQL_SMALL_RESULT`:MySQL 的“小优化”大作用
  • 【unity实战】用unity封装一个复杂全面且带不同射击模式的飞机大战射击系统
  • Navicat 17.2 正式发布 | AI 助手、支持 Snowflake...超多新功能等你解锁
  • [贪心算法]-最大数(lambda 表达式的补充)
  • 4.JVM-垃圾回收介绍
  • 双链笔记新选择!使用Docker私有化部署Logseq知识库远程团队协作
  • Java学习------static、final、this、super关键字
  • 中国强镇密码丨洪泽湖畔的蒋坝,如何打破古镇刻板印象
  • 湖北鄂城:相继4所小学有学生腹泻呕吐,供餐企业负责人已被采取强制措施
  • “五一”逃离城市计划:带上帐篷去大自然里充电
  • 中国海油总裁:低油价短期影响利润,但也催生资产并购机会
  • 中国空间站首批在轨繁育果蝇即将返回地球,有望获得多项科学成果
  • 举牌超200轮!中铁建7.76亿元竞得北京通州梨园宅地