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

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

第四节、C# 上位机面向对象编程详解(工控硬件继承实战版) 继承核心价值:在 C# 上位机工控开发中,继承的核心是通用逻辑复用与接口统一,将所有硬件的通用属性 / 方法封装到抽象基类,子类只需实现独有逻辑,大幅减少冗余代码。基类设计要点:优先使用抽象基类,合理分配访问修饰符(privateprotectedpublic),定义通用事件与虚方法,提供资源释放机制,兼顾复用性与扩展性。子类设计要点:通过: base()调用基类构造函数,强制实现抽象方法(保证接口统一),选择性重写虚方法(实现独有逻辑),复用基类的protected成员。多设备管理。 阅读详情

相关推荐

Verilog除法器(32位无符号+带符号)

32位无符号除法器设计 恢复余数法: 恢复余数除法的基本思路是从“部分余数”中减去除数,如果结果为负(不够减),则恢复原来的部分余数,商0. 寄存器使用: reg_r 存放被除数a reg_b 存放除数b reg_r 存放余数(初始清零) 具体做法: 做减法时,减数是reg_b中的除数,被减数是reg_r中的余数左移一位,最低位由reg_q(被除数)的最高位补充。为了能够判断相减结果的正...

qq_38600065的博客 1万+

主席树简介及应用

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

hnjzsyjyj的专栏 3313

常用的串口通信工具MobaXterm、Bus Hound、SScom等

本文介绍了四种PC端串口通信工具的功能和使用方法:MobaXterm支持SSH、FTP、串口等多种协议;Bus Hound用于监控CAN和串口数据;SScom专为串口和网口通信设计;ScriptCommunicator可进行串口通信并绘制波形图。每种工具都有详细的操作步骤图示,包括参数设置、数据监控等关键功能,并提供了官方和个人下载地址。这些工具各有特点,适用于不同的串口通信和数据分析场景。

sanqima的专栏 2490

【学习笔记】主席树

关于主席树的介绍有一篇博客很详细,适合入门:主席树入门 主席树需要的前置知识有:前缀和和线段树 主席树上的差分区间与前缀和有关,而主席树的建树,修改,查询和线段树很相似,学了线段树之后看主席树就显得没有那么困难。 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

Camera 基础知识

Raw Sensor输出的Data格式为Raw,图像的效果处理使用BB端的ISP,BB端接收Raw data后进行一系列的图像处理(OB,Shading,AWB,Gamma,EE,ANR等),效果方面由BB端控制,需要针对不同的模组进行效果调试,Raw sensor是目前的主流,数据量比YUV Sensor小(RAW10 格式的sensor 1个pixel 10个bit)使用平台ISP处理,能支持较大的size。不过,相位对焦并不是那么完美,它对光线的要求就比较高,在弱光拍摄环境下,相位对焦就无能威力了。

手机-手表蓝牙开发工程师的博客 3062

QDMA工程搭建/windows驱动编译与性能测试

请注意,根据您的目标操作系统,您可能需要在windows启动配置中启用测试签名的驱动程序,以便启用此驱动程序的安装。右键单击设备,选择更新驱动程序软件,然后选择构建的QDMA驱动程序的文件夹(通常为。创建一个新工程,在IP Catalog中搜索QDMA,双击创建qdma ip核。驱动程序安装安装驱动程序最简单的方法是通过Windows的“设备管理器”。如果系统提示未经验证的驱动程序发布者,请选择无论如何安装此驱动程序软件。本节主要介绍QDMA驱动在Windows系统的源文件、编译和安装过程。

qq_28455081的博客 2287

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

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

zje11的博客 2741

《Python星球日记》 第73天:情感分析与主题建模

《Python星球日记》 第73天:情感分析与主题建模,今天我们将探索两个自然语言处理领域的重要技术:情感分析和主题建模。这两项技术在社交媒体分析、用户反馈处理、市场研究等多个领域有着广泛应用。

Code_流苏:在代码中寻诗意,在实践中觅真知 919

主席树详解(基础)

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

nxhx_的博客 4661

Ultralytics YOLOv8 英伟达™ Jetson®处理器部署

英伟达™(NVIDIA®)Jetson 是一系列嵌入式计算板卡,旨在为边缘设备带来加速的 AI(人工智能)计算。这些小巧而功能强大的设备围绕英伟达™(NVIDIA®)的GPU架构打造,能够直接在设备上运行复杂的人工智能算法和深度学习模型,而无需依赖云计算资源。Jetson 板卡通常用于机器人、自动驾驶汽车、工业自动化和其他需要在本地以低延迟和高效率执行人工智能推理的应用中。此外,这些板卡基于 ARM64 架构,与传统 GPU 计算设备相比运行功耗更低。英伟达™(NVIDIA®)JetPack SDK。

机器人控制与仿真应用 3876

【Python机器学习】零基础掌握TweedieRegressor广义线性回归模型

本次文章主要介绍了如何使用Tweedie回归模型预测电动汽车的实际续航里程。基于车速、气温和驾驶习惯等多种因素,模型能够准确地预测出电动汽车的续航里程,从而为生产商和消费者提供有用的信息。优点总结,Tweedie回归模型在处理具有多元性和高度散布的数据方面表现出色,特别适用于需要考虑多种影响因素的预测任务。优点名称对应描述说明多元性强可以同时处理多种类型和维度的数据高度可定制允许用户自定义损失函数和正则项对异常值鲁棒能够较好地处理数据中的异常值易于解释参数和预测结果都相对容易解释。

Mr数据杨 1006

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

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

WilliamSun0122的博客 8314

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

静态主席树

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

141

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

CMC_YXY的博客 431

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

QDU_ZXF的博客 5137

动态主席树

经过几天的疯狂学习,咸鱼博主终于学会了动态主席树!书接上文。 在上一篇博文里学习了静态主席树的写法。 核心思想就是在原有的基础上建立新的线段树。 但是那只能解决静态的问题。 如果我们在原有的查询操作上加入单点修改,又该如何用主席树实现呢?例子 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、付费专栏及课程。

余额充值