最详细的讲解,让你一次学会主席树

RMQ——支持合并和优先级的消息队列 在一个项目中需要实现一个功能,商品价格发生变化时将商品价格打印在商品主图上面,那么需要在价格发生变动的时候触发合成一张带价格的图片,每一次触发合图时计算价格都是获取当前最新的价格。上游价格变化的因素很多,变化很频繁,下游合图消耗GPU资源较大,处理容量较低。上游生产速度很快,下游处理速度很慢,上下游处理速度存在巨大差距时,我们首先可以想到使用消息队列进行削峰填谷,比如RocketMQ、Kafka。但是,在本项目的背景中,触发价格变化的来源很多,产生的触发消息可能存在大量重复,下游重复消费不但会浪费资源还会导 阅读详情

好久以前就想学习主席树这个黑科技,一直觉得很难,然后平时上课也没有什么好的时间,所以一直搁置到现在,最近遇到了一个比较简单,比较经典的问题,求区间第k小,比如poj2104,没有更新操作,只有查询操作,因为最近一直在学习分块思想,既然没有更新操作,我觉得可以用分块搞一下,但是一直tle,我的大致思想是把原序列分为为若干块,然后对每一块进行块内排序,每次 查询操作就是二分区间第k小元素设为x,judge的判断根据是区间小于x的数的个数小于k,因为我们在前面进行块内排序,对于一个区间里面如果包含整块,我们对这个块进行二分来找有多少数小于x,对于非整块,我们直接暴力就行,但是这种做法就是不过不了,一直tle,网上有人用这种方法过了,但是我不知道我的为什么过不了,可能写的比较丑吧,下面是我的分块代码,希望大神们指点一下

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int n, m;
int a[maxn];//原数组
int MAGIC;//块的大小
int b[maxn];//按块排好序的数组
int c[maxn];//整体从小到大排好序的数组,用于整体二分求第k大元素
void init()
{
    MAGIC = (int)sqrt(n);
    for(int i = 0; i < n;)
    {
        if(i + MAGIC - 1 < n)
        {
            sort(b + i, b + i + MAGIC);
        }
        i += MAGIC;
    }
}
bool judge(int l, int r, int x, int k)//在区间l,r中小于x的数的个数是否小于k
{
    int num = 0;//小于x的数的个数
    for(int i = l; i <= r;)
    {
        if(i % MAGIC == 0 && (i + MAGIC - 1) <= r) //在块内,在数组b中进行二分查找
        {
           int left = i;
           int right = i + MAGIC - 1;
           int loc = -1;
           while(left <= right)
           {
               int mid = (left + right)>>1;
               if(b[mid] >= x)
               {
                   loc = mid;
                   right = mid - 1;
               }
               else left = mid + 1;
           }
           if(loc < 0) loc = MAGIC;
           else loc -= i;
           num += loc;
           i += MAGIC;
        }
        else
        {
           if(a[i] < x) num++;
           i++;
        }

    }
    if(num < k) return true;
    else return false;
}
int solve(int l, int r, int k)//求解区间l, r的第k大值
{
    int L = 0;
    int R = n - 1;
    int re = -1;
    while(L <= R)
    {
        int mid = (L + R)>>1;
        if(judge(l, r, c[mid], k))
        {
            re = c[mid];
            L = mid + 1;
        }
        else R = mid - 1;

    }
    return re;
}
int main()
{
    freopen("C:\\Users\\creator\\Desktop\\in.txt","r",stdin) ;
    freopen("C:\\Users\\creator\\Desktop\\out.txt","w",stdout) ;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
        c[i] = a[i];
        b[i] = a[i];
    }
    sort(c, c + n);
    init();
    int l, r, k;
    for(int i = 1; i <= m; i++)
    {
        scanf("%d%d%d", &l, &r, &k);
        printf("%d\n", solve(l - 1, r - 1, k));
    }
    return 0;
}

居然分块过不了,没有办法只有用主席树来怼了,于是我花了一整天的时间来学了这个黑科技,刚开始看的时候看的我一脸懵逼,最后终于是学了一点皮毛,能够勉强解决静态区间第k小问题,至于动态区间第k小问题,我会在后面学习,到时候也会写一篇博客与大家交流讨论。

首先我们来了解什么叫做主席树,下面是从其他大佬的博客中复制过来的了解一下就行

所谓主席树呢,就是对原来的数列[1..n]的每一个前缀[1..i](1≤i≤n)建立一棵线段树,线段树的每一个节点存某个前缀[1..i]中属于区间[L..R]的数一共有多少个(比如根节点是[1..n],一共i个数,sum[root] = i;根节点的左儿子是[1..(L+R)/2],若不大于(L+R)/2的数有x个,那么sum[root.left] = x)。若要查找[i..j]中第k大数时,设某结点x,那么x.sum[j] - x.sum[i - 1]就是[i..j]中在结点x内的数字总数。而对每一个前缀都建一棵树,会MLE,观察到每个[1..i]和[1..i-1]只有一条路是不一样的,那么其他的结点只要用回前一棵树的结点即可,时空复杂度为O(nlogn)。

看了什么的介绍,感觉并没有什么卵用,还是一脸懵逼,下面我一点一点来讲解主席树的原理以及实现过程和代码。

在学习主席树之前,需要你很熟悉线段树这个东西,因为主席树的主体是多颗线段树,首先我们来简单的回顾一下线段树的简单特点和性质,我们熟悉的线段树一般是用一个结构体表示一个节点,每个节点有一个编号,节点里面一般有两个变量l, r来表示这个节点维护的区间,然后还有一个区间信息(比如区间最大值,最小值,和等,视具体问题而定),当然如果涉及到区间更新,还有一个add或者lazy叫做延迟标记的东西,然后一般线段树最明显的特点就行,一个父节点的编号是i,那么他的两只儿子节点的编号分别为2 * i(左) , 2 * i + 1(右),注意主席树在这一点有别于一般的线段树,每一个父节点,他的两个儿子节点的编号不一定满足这个关系。

我们先来分析一下对于任意一个区间,我们怎样求解这个区间的第k小值,当然一个最简单的做法就是把这个区间的数都拿出来排个序,然后直接输出就好,这很简单,但是复杂度爆表,我们考虑一个线段树的做法,假如一个区间l, r我们用一个用这个区间内出现过的数的个数组成一颗线段树,这是什么意思呢,求一个区间的第k小数,当然与这个区间有多少数比他小有关,在这里我举一个例子来说明一下怎样建立这样的一颗线段树。比如这个区间表示的序列是4,1,3,2,我们要求第2小,我们一眼就看出是2,那么我们怎样上面所说的线段树来求解呢,下面我画了一幅图来讲解,其中这颗线段树上的每个节点维护的是这个节点表示区间内的个数(假设每个数都不一样)

这里写图片描述
圈内的数字表示这个区间里面有多少个数,最后叶节点表示一个数字,对应上述序列中的一个数,注意,任意一个长度为N的序列我们都可以把他离散为一个1 ,2,3,,,,N的序列,只需要简单的hash一下就行。然后这样的一颗线段树建立出来了,我们怎样寻找区间第2小,因为叶节点从左到右表示的数依次增大,根据这个性质,以及每个节点保存了区间内的数的个数这个信息,我们可以轻易的找出区间第2小,具体的找法是,从根节点开始,看左儿子里面的数的 个数是不是大于等于2,如果是则第2小一定在左子树中,于是继续找左子树,反之找右子树,直到找到叶节点为止,然后直接返回叶节点表示的值就行。

但是多次询问区间第k小,我们每次这样建立一个线段树,这样不仅空间复杂度非常之高,而且时间复杂度也非常高,甚至比普通排序还要高,那么我们只不是可以想一个办法,使得对于每次我们查询不同的区间我们不需要重新建树,如果这样。时间复杂度和空间复杂度就大大降低了。

我们很容易就联想到了前缀和的概念,比如我们有一个问题。就是每次静态的求区间和,我们可以预处理所以的前缀和sum[i],我们每次求解区间l, r和时,我们可以直接得到答案为sum[r] - sum[l -1],这样就不需要对区间中的每个数进行相加来求解了。

同样一个道理,我们也可以利用前缀和这个思想来解决建树这个问题,我们只需要建立n颗“前缀”线段树就行,第i树维护[1,i]序列,这样我们处理任意区间l, r时就可以通过处理区间[1,l - 1], [1,r],就行,然后两者的处理结果进行相加相减就行。为什么满足相加减的性质,我们简单分析一下就很容易得出。如果在区间[1,l - 1]中有x个数小于一个数,在[1,r]中有y个数小于那个数,那么在区间[l,r]中就有y - x 个数小于那个数了,这样就很好理解为什么可以相加减了,另外,每颗树的结构都一样,都是一颗叶节点为n个的线段树。

上述利用前缀和的思想只是解决了时间复杂度的问题,并没有解决空间复杂度的问题,要解决空间复杂度问题。我们需要用到线段树的性质,我们每次更新一个数,那么与更新之前相比,这颗线段树改变只是一条链(从根节点到某一叶节点),那么我们可以充分利用这个特点,因为第i颗树与第i- 1颗树相比,只是更新了第i个元素,所以这两棵树有很多相同的节点,所以这两棵树可以共用很多节点(这也是为什么主席树的中节点编号不满足儿子节点编号是父节点编号的两倍和两倍加一的原因),于是这样就解决空间复杂度问题。

说了这么多,下面是我的代码,代码中有详细的注释,你可以结合代码和上面的讲解看(下面代码是poj2104的ac代码)。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1e5 + 10;
int n, m;
int cnt;
struct node{
    int L, R;//分别指向左右子树
    int sum;//该节点所管辖区间范围内数的个数
    node(){
        sum = 0;
    }
}Tree[maxn * 20];
struct value{
    int x;//值的大小
    int id;//离散之前在原数组中的位置
}Value[maxn];
bool cmp(value v1, value v2)
{
    return v1.x < v2.x;
}
int root[maxn];//多颗线段树的根节点
int rank[maxn];//原数组离散之后的数组
void init()
{
    cnt = 1;
    root[0] = 0;
    Tree[0].L = Tree[0].R = Tree[0].sum = 0;
}
void update(int num, int &rt, int l, int r)
{
    Tree[cnt++] = Tree[rt];
    rt = cnt - 1;
    Tree[rt].sum++;
    if(l == r) return;
    int mid = (l + r)>>1;
    if(num <= mid) update(num, Tree[rt].L, l, mid);
    else update(num, Tree[rt].R, mid + 1, r);
}
int query(int i, int j, int k, int l, int r)
{
    int d = Tree[Tree[j].L].sum - Tree[Tree[i].L].sum;
    if(l == r) return l;
    int mid = (l + r)>>1;
    if(k <= d) return query(Tree[i].L, Tree[j].L, k, l, mid);
    else return query(Tree[i].R, Tree[j].R, k - d, mid + 1, r);
}
int main()
{
    //freopen("C:\\Users\\creator\\Desktop\\in.txt","r",stdin) ;
    //freopen("C:\\Users\\creator\\Desktop\\out.txt","w",stdout) ;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &Value[i].x);
        Value[i].id = i;
    }
    //进行离散化
    sort(Value + 1, Value + n + 1, cmp);
    for(int i = 1; i <= n; i++)
    {
        rank[Value[i].id] = i;
    }
    init();
    for(int i = 1; i <= n; i++)
    {
        root[i] = root[i - 1];
        update(rank[i], root[i], 1, n);
    }
    int left, right, k;
    for(int i = 1; i <= m; i++)
    {
        scanf("%d%d%d", &left, &right, &k);
        printf("%d\n", Value[query(root[left - 1], root[right], k, 1, n)].x);
    }
    return 0;
}

电机控制个人学习路线及专业书籍资源分享 个人学习电机控制的学习路线,和相关专业书的电子文档分享 阅读详情

相关推荐

一种基于OpenPose和DNN的跌倒检测软件系统(中文&英文)

学习并实现一种跌倒检测模型,此模型基于OpenPose实现逐帧人体姿态检测,使用DNN识别人体动作。检测方式有在线与离线两种,本文主要测试了离线模式,测试效果较好。

Tongzhou_Li的博客 2645

主席树简介及应用

【主席树简介】 主席树,即可持久化线段树,又称函数式线段树,是重要的可持久化数据结构之一。所谓可持久化,是指可以回溯到历史版本。 主席树的本质,就是在有数据更新时,在基准线段树的基础上采用“结点复用”的方式仅仅增加少量结点来维护历史数据,而不是通过存储不同版本线段树的方式来维护历史数据,从而达到减少时空消耗的目的,避免出现TLE(Time Limit Exceeded)及MLE(Memory Limit Exceeded)错误。主席树空间一般建议是开n<<5(n为基准线段树的结点数)。 如在..

hnjzsyjyj的专栏 3313

Sharding-JDBC 系列专题 - 第九篇:高可用性与集群管理

高可用性是指系统在面对故障(如数据库宕机、网络中断)时,能够快速恢复并继续提供服务。Sharding-JDBC 和 Sharding-Proxy 提供了多种机制支持高可用性,同时需要结合底层数据库的高可用方案(如 MySQL 主从复制、MHA)来实现。高可用性和集群管理是 Sharding-JDBC 和 Sharding-Proxy 在生产环境中成功应用的关键。本篇详细介绍了数据库高可用方案、Sharding-JDBC 的故障切换机制、Sharding-Proxy 的集群部署,以及分布式治理功能。

资深架构师分享:深入剖析软件架构,探讨云计算、微服务、大数据等前沿技术。分享实践经验,促进技术交流,共同构建卓越系统。 1393

【学习笔记】主席树

关于主席树的介绍有一篇博客很详细,适合入门:主席树入门 主席树需要的前置知识有:前缀和和线段树 主席树上的差分区间与前缀和有关,而主席树的建树,修改,查询和线段树很相似,学了线段树之后看主席树就显得没有那么困难。 1.建树 void build(int &rt,int l,int r) { rt=++sz,sum[rt]=0; if(l==r) return ; int mid=(l+r)>>1; build(lc[rt],l,mid),build(rc[

More_Progress的博客 893

手把手教你学Simulink——基于Simulink的多轮PMSM同步驱动交叉耦合控制

摘要:本文针对多轮PMSM同步驱动系统的负载不均、参数差异等问题,提出基于Simulink的交叉耦合控制解决方案。通过实时补偿轮间同步误差,实现同步误差<1%、转矩脉动<5%的性能提升。文章详细介绍了系统架构、核心算法(包括PMSM数学模型和偏差耦合控制算法)、Simulink建模步骤及参数设置,并通过仿真验证了稳态和动态性能。同时提供了工程调试建议和完整代码实现,为多轮驱动系统开发提供实用参考。该方案计算量小,可移植性强,适用于电动汽车、AGV等应用场景。

MHD0815的博客 140

Microsoft Forms功能深度解析:企业数据收集与协作的智能利器

Microsoft Forms是微软365生态中的在线表单工具,支持问卷调查、测验和投票创建,具备拖拽式界面、多题型设计和实时数据分析功能。其核心价值在于易用性、跨平台兼容性以及与Teams、SharePoint等微软服务的深度集成,满足GDPR/HIPAA等合规要求。提供表单创建、权限管理、自动化流程(通过Power Automate)和审计日志等功能,适用于金融、医疗、教育等多行业场景。虽然存在逻辑分支有限等约束,但通过案例证明能显著提升数据收集效率(达70-85%)。使用时需注意许可证配置(Busin

xueyunshengling的博客 9125

可持久化数据结构-线段树(主席树)

可持久化线段树的概念和简单运用

zje11的博客 2741

第3讲:单端传输线的时域TDR仿真(基于实战的第一次仿真视角切换)

本文为CST仿真系列教程的第3讲,主要介绍传输线阻抗(TDR)的两种仿真方法:基于S参数的频域计算和基于高斯脉冲的时域计算。文章详细演示了在CST PCB Studio中修改电容参数、设置TDR仿真参数(包括截止时间和采样点数)的操作步骤,并通过对比实验展示TVS寄生电容对阻抗曲线的影响。最后将两种TDR方法的结果进行对比,验证了两种方法的一致性。本教程适合硬件工程师通过时域波形直观分析传输线阻抗特性,是信号完整性分析的重要技能。

一只豌豆象的博客 227

主席树详解(基础)

可持久化线段树,又称主席树,本文详解它的构成和基础用法

nxhx_的博客 4661

华为OD机考真题 新系统 - 小菊的寻宝之旅(Java/Py/C/C++/Js/Go)

华为OD机试真题 新系统【小菊的寻宝之旅】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【小菊的寻宝之旅】多语言题解。

qq_45776114的博客 620

Hermes Agent 实战复盘:5 类超预期场景与3 个典型翻车案例分析

揭示 Hermes Agent 在 PDF 智能解析、低代码评审结构化、Kanban 任务驱动执行等五类未被文档覆盖的超预期落地场景,核心依赖 `soul.md`/`CLAUDE.md`/`kanban` 三层上下文建模机制,而非单纯堆 token 或 agent 数量。

weixin_42520239的博客 384

主席树 (动态)图文讲解让你一次就懂 zoj2112为例

主席树(动态)学动态主席树之前一定要先会静态主席树。 静态主席树:http://blog.youkuaiyun.com/williamsun0122/article/details/77871278参考博客:http://www.cnblogs.com/Empress/p/4659824.html 这个博客讲的是对的,不过它的图和代码好像是错的,虽然能过,但应该是数据不够强,具体怎么错的它的博客下面评论有。

WilliamSun0122的博客 8314

智能车图像处理16-进阶篇8--右环岛状态机与补线

这篇文章主要讲述智能车竞赛中如何判断右环岛并且进行状态补线。

taiyuezyh的博客 1万+

静态主席树

这个东西对于我这种菜鸡来说还是有一点难以把他解释清楚,所以在一些关键的讲解步骤(我自己解释不清楚的地方),我就只好引用一下一些大佬的!(其实写完了以后发现这些东西都是我自己写的!!!嗯,有进步!!!) 下面我就开始讲哈! 相信大家看这篇讲解之前都应该看了我前面写的一篇博客,如果没有看大家可以先去看一下: 讲解传送门(求整体区间第k...

141

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

浅谈主席树(可持久化线段树)

主席树(可持久化线段树) 前言: 建议先掌握线段树再来学习此知识点 这几天在中山纪中训练时有做到可持久化字典树的题,听别人说可持久化数据结构的思路都是差不多的,于是我便先上网学了学我看起来认为最简单的可持久化线段树(主席树),学了两个晚上终于学会了一点皮毛 (~ ̄▽ ̄)~,于是我便来总结一下理理思路 博客可能写的一般大佬勿喷…… 名字分析: 顾名思义,可持久化的就是可以记录历史版本的意思,通过主席树,我们可以查询到单个节点或一段区间历史的信息,或者对于某个历史版本进行单点修改产生新的版本。(如果想进行区间修

CMC_YXY的博客 431

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

主席树入门详解一(学习笔记)(例题POJ-2104 求区间第k小)

学习主席树,在网上搜了很多教程(都好简短啊,直接就是几行字就上代码,看不懂啊有木有~~),最后才很艰难的学会了最基础的部分。下面就是我在学习的过程中的产生的疑惑和解决的办法。 学习主席树需要的前置技能:线段树。 参考资料 1. B站上的视频讲解(话说B站真的啥都有啊) https://www.bilibili.com/video/av4619406/?p=1 2.参考博客 https:...

QDU_ZXF的博客 5137

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

动态主席树

经过几天的疯狂学习,咸鱼博主终于学会了动态主席树!书接上文。 在上一篇博文里学习了静态主席树的写法。 核心思想就是在原有的基础上建立新的线段树。 但是那只能解决静态的问题。 如果我们在原有的查询操作上加入单点修改,又该如何用主席树实现呢?例子 1 2 10 9 8 建好线段树森林(省略~) 操作 更改 2 位置的数 变为 6 如果我们直接暴力对从2开始的每一个线段树都进行一次修改 时

HT008的Blog 346

第九周周任务——权值线段树和主席树

第九周周任务——主席树 Minimum Inversion Number hdoj1394 这道题,看到好多博客,有好多解题的方法,树状数组,线段树,暴力,归并 #include <cstdio> #include <algorithm> #include <iostream> #include <map> #include <string&g...

zhangyi3210的博客 209

zoj 2112 单点修改的主席树(树状数组套主席树)

题目大意: 区间第k大问题+单点修改 基本思路: 这个题有用整体二分,cdq分治,还有主席树+平衡树的,还有就是主席树+树状数组。 我采用的是b站电子科大大佬的主席树写法,尤其喜欢他的离散化方法,所以就这么写了。 下面对代码进行下解释(当然,详细解释看注解): root[i]:第i棵树根节点的编号,i就是原来序列的下标,代码里从1开始 tr[i]:树状数组第i棵树根节点的编号 ur...

weixin_30352645的博客 234

专题训练之主席树

推荐几个博客:http://www.cnblogs.com/zyf0163/p/4749042.html 树状结构之主席树 https://blog.youkuaiyun.com/creatorx/article/details/75446472 最详细的讲解,让你一次学会主席树 https://blog.youkuaiyun.com/jerans/article/details/75807666 主席树题集 ht...

weixin_30532369的博客 143

[算法学习]——可持久化权值线段树求区间第k小(主席树)

可持久化权值线段树(主席树)讲解

Resot的博客 1181

南华大学计算机学院团学会成员,【计算机科学与技术学院】计算机学院第九届研究生团学会换届选举会议圆满结束...

11月8日下午,计算机科学与技术学院第九届研究生团学会换届选举会议在学院会议室顺利召开。院党委副书记卢清华,负责研究生工作的蒋良卫和苏玲玲出席了本次选举换届会议。会议由第八届研究生团学会主席谢元忱主持。会议开始,蒋良卫致开场辞。会议第一项,蒋良卫向大会通报会议的参加人数、议题、会议流程及换届选举办法。并介绍了此次选举换届的原则,即民主自愿、公正公开、择优竞选。随后蒋老师着重讲解了学院研究生奖、助学...

weixin_36434922的博客 378

深圳市物联网产业协会承办的“深圳市科学技术协会2021年度学会工作会议”成功召开

2021年12月21日,由深圳市物联传媒有限公司、深圳市物联网产业协会承办的“深圳市科学技术协会2021年度学会工作会”在福田区新一代产业园天使荟路演中心召开。会议总结了2021年市科协学会工作和各学会工作亮点,部署2022年工作。深圳市人大常委会副主任、市科协主席蒋宇扬,市科协党组书记、驻会副主席林祥出席,会议由市科协党组成员、一级调研员孙楠会议。市科协学会部全体工作人员、市科协所属科技类社会组织负责人、市科技类社会组织联合党委所属各党支部书记100余人参加会议。 会上,蒋宇扬主席充分肯定了20..

xhwuli的专栏

南宁市信息技术学会专家领导莅临泰迪智能科技参观交流

6月6日,南宁市信息技术学会专家领导莅临广东泰迪智能科技股份有限公司产教融合实训基地参观交流。 广西高等教育学会高校教育技术专业委员会常务副理事长兼秘书长、梁业生教授,南宁市信息技术学会党支部书记、副会长兼秘书长毛宁,南宁市信息网络安全协会秘书长何毅,广西农业职业技术大学农业工程学院副院长孙奇, 南宁赛鸣信息技术有限公司总经理、科协主席吴启军,上海曼恒数字技术有限公司广西负责人何述臣,南宁市信息网络安全协会技术顾问余民华,南宁市信息技术学会常务副秘书长李凯军,副秘书长刘茜出席本次参观交流活动。

tipdm0526的博客 445

知数堂北京同学会

知数堂北京同学会 继知数堂上海同学会后,知数堂北京同学会在2018年12月22日在朝来科技园青云的会议室里举办。因为场地限制,这次活动,没敢大的宣传,举办了一个小规模的聚...

老叶茶馆 345
上一篇: HUST1718(ac自动机)
下一篇: 动态区间第k小(主席树+线段树套树状数组)
creatorx
博客等级 码龄10年 127粉丝 145原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值