首页 > 其他分享 >线段树 动态开点

线段树 动态开点

时间:2024-03-29 10:58:05浏览次数:17  
标签:return rs int 线段 tree mid ls 动态

红色圈出来的4个点就是查出来的其中两个?圈是没有被开出来的区间就是0,其实答案就是[3,3]+[6,8]

动态开点模板:

struct Tree {
    int l, r, n, ls, rs;
}

void update(int &t, int l, int r, int pos, int n) {
    if (!t) {
        t = ++ cnt;
        tree[t].l = l;
        tree[t].r = r;
    }
    if (l == r) {
        tree[t].n = n;
        return;
    }
    int mid = (l + r) >> 1;
    if (pos <= mid) {
        update(tree[t].ls, l, mid, pos, n);
    } else {
        update(tree[t].rs, mid + 1, r, pos, n);
    }
}

int getnum(int t, int l, int r) {
    if (!t) {
        return 0;
    }
    if (tree[t].l == l && tree[t].r == r) {
        return tree[t].n;
    }
    int mid = (tree[t].l + tree[t].r) >> 1;
    if (r <= mid) {
        return getnum(tree[t].ls, l, r);
    } else if (l > mid) {
        return getnum(tree[t].rs, l, r);
    } else {
        return getnum(tree[t].ls, l, mid) + getnum(tree[t].rs, mid + 1, r);
    }
}

例子:假设有7个数 分别是:1 3 2 2 3 5 7

那么:前1个的中位数是1

         前3个的中位数是:(1,3,2) 是2

前5个的是 :2      前7个的中位数是3

所以答案就是:1 2 2 3

思路:用线段数来维护哪些数字出现过,并且这个数字出现过多少次

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

const int MAXN = 1e5 + 7;
const int INF = 1e9 +7;
int n;

struct Tree {
    int l, r, v, ls, rs,num;
};

int root,cnt;

//表示将MAXN左移四位,相当于乘以2的16次方(即65536)。
// 因此,这个数组的大小为MAXN * 65536。
Tree tree[MAXN << 4];

void update(int &t, int l, int r, int k) {
    if (!t) {
        t = ++ cnt;
        tree[t].l = l;
        tree[t].r = r;
    }
    if (l == r) {
        tree[t].v = n;
        tree[t].num++;
        return;
    }
    int mid = (l + r) >> 1;
    if (k <= mid) {
        update(tree[t].ls, l, mid, k);
    } else {
        update(tree[t].rs, mid + 1, r, k);
    }
    tree[t].num = tree[tree[t].ls].num + tree[tree[t].rs].num;
}

//t是当前节点,k为剩余排名
int _rank(int t,int k)
{
    if(tree[t].ls == tree[t].rs)
    {
        return tree[t].v;
    }
    if(tree[tree[t].ls].num >= k)
    {
        return _rank(tree[t].ls,k);
    }
    else
    {
        return _rank(tree[t].rs,k-tree[tree[t].ls].num);
    }
}

int main()
{
    int x,y;
    cin>>n>>x;
    update(root,0,INF,x);
    cout<<x<<endl;

    for(int i = 3 ; i<= n ; i += 2)
    {
        cin>>x>>y;
        update(root,0,INF,x);
        update(root,0,INF,y);
        cout<<_rank(root,i / 2 + 1)<<endl;
    }
    return 0;
}

标签:return,rs,int,线段,tree,mid,ls,动态
From: https://blog.csdn.net/2303_79132118/article/details/137080382

相关文章

  • 动态开点线段树
    求区间最值importsyssys.setrecursionlimit(1000000)classNode:__slots__=["left","right","val","tag"]def__init__(self,left=None,right=None,val=0,tag=0):self.left=leftself.righ......
  • HTML精美登录页面,(动态渐变效果+稍微透明效果)
    最近,学校留的html作业做出来十分简陋学校作业如上图所示,今天我来教大家做一个精美的登录页面。以下是精美的登录页面。HTML精美登录页面接下来我来带大家写代码一,HTML代码<bodyclass="meau"><divclass="formBox"><formaction=""class="FORMF">......
  • Mybatis进阶之动态SQL
    1、MyBatis获取参数值的两种方式MyBatis获取参数值的两种方式:${}和#{}${}的本质就是字符串拼接,#{}的本质就是占位符赋值${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日......
  • 3/28 线段树优化建图
    (1)CF786BLegacy有一张\(n\)个节点和若干条边。边用\(q\)条信息表示:1vuw表示有一条连接\(v\tou\)的有向边,边权为\(w\);2vlrw表示对于所有\(u\in[l,r]\),都有一条连接\(v\tou\)的有向边,边权为\(w\);3vlrw表示对于所有\(u\in[l,r]\),都有......
  • QCustomPlot多段y轴公用x轴、动态增加/移除曲线显示功能
    备注:1、动态增加/移除坐标系;2、多段y轴,共用同一个x轴;3、x轴y轴数据同步,当放大缩小表格时;4、通过定时器0.5s更新一次数据;****亲,感觉不错的话点个赞哦****一、项目中结合树形目录勾选框,进行动态增加和删除勾选框,通过定时器模拟数据进行显示connect(m_treeWidget,&Tr......
  • KingbaseES生成动态SQL
    1.动态SQL动态SQL在程序启动时会根据输入参数替换相应变量。使用动态SQL可以创建更强大和灵活的应用程序,但在编译时SQL语句的全文不确定,因此运行时编译会牺牲一些性能。动态SQL可以是代码或SQL语句的一部分,动态部分要么由开发人员输入,要么由程序本身创建。1.1动态SQL使用场景......
  • 动态判断是否需要Api接口鉴权
    一.概述问题:在使用asp.netcoreapi做业务开发时,在本地vs开发环境,部署后的测试环境,都需要先获取access_token,才能访问api接口,这样浪费了调试与测试时间。    现状:我这里是通过Apollo配置中心定义了二套配置环境,一是Dev环境:用于本地vs开发环境,部......
  • 写模板,线段树
    1意义:线段是是为了对区间中的元素进行操作,而衍生出来的一种数据结构,比如区间加减,区间求和。线段树将1~n的区间分解成4n个小区间。2过程:区间修改就是对一个或者多个节点按照设定的规则对数值进行修改。区间查询就是对一个或多个节点查询的结果按规则进行合并,得到最终结果。其......
  • 【京东云新品发布月刊】2024年3月产品动态
    1.【言犀模型服务】新品上线言犀模型服务平台致力于为开发者提供AI原生应用开发的全链路服务,内置丰富的应用插件,提供便捷的集成方式,结合企业专属数据和API,助力企业高效完成大模型应用构建。2.【数据库管理服务DMS】新品上线数据库管理服务DMS(DatabaseManagementService)是京......
  • 动态内存管理
    目录1.为什么要有动态内存分配2.malloc和free2.1malloc2.2free3.calloc和realloc 3.1calloc3.2realloc 4.常⻅的动态内存的错误4.1对NULL指针的解引⽤操作4.2对动态开辟空间的越界访问4.3对⾮动态开辟内存使⽤free释放4.4使⽤free释放⼀块动态开辟......