主席树学习记录

可持久化线段树(主席树) 摘要 主席树,又称可持久化线段树,属于可持久化数据结构。“主席”这一名词是由于发明者缩写为HJT,和某位主席拼音缩写相同(有些牵强),故将该数据结构称为主席树。 主席树既保留了线段树的灵活,也拥有了可持久化数据结构的特点,在处理某些特定问题时有着其它数据结构不具有的优势。 本文将首先介绍什么是“可持久化数据结构”,随后介绍主席树的思想,关于代码实现将结合例题讲解。 可持久化数据结构 可持久数据结构... 阅读详情

搞了一段时间网络流后,最后还是回到了数据结构。。。

主席树,引fotile主席的一段话:

..这个东西是当初我弱不会划分树的时候写出来替代的一个玩意..被一小撮别有用心的人取了很奇怪的名字> <
想法是对原序列的每一个前缀[1..i]建立出一颗线段树维护值域上每个数的出现次数,然后发现这样的树是可以减的,然后就没有然后了

其实是一种比较好理解的数据结构(至少静态查找时是如此),我们对于每个点,建一个类似与前缀和的线段树,然后我们发现这样的n棵线段树是可以相减的,于是。。。但是在实现过程中,由于内存限制的原因,我们一般用指针实现。

COGS 930 找第k小的数。裸题,直接上模板。code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mid (l+r)/2
using namespace std;
struct node{
	node *left,*right;
	int a,size;
	node(){left=right=NULL; size=a=0;}
	int updata()
	  {
	  	size=a;
	    if (left) size+=left->size;
	    if (right) size+=right->size;
	  }
}*null=new node(),*root[100001]={NULL},q[2000001];
int n,m,a[100001],b[100001];
int temp,ans;
void build(node *&y,node *&x,int l,int r,int t)
{
	if (x==NULL) x=null;
	y=&q[++temp]; 
	*y=node();
	if (l==r)
	  {
	    *y=*x; y->size++; y->a++;
		return;  
	  }
	if (t<=b[mid])
	  {
	    build(y->left,x->left,l,mid,t);
	    y->right=x->right;
	    y->updata();
	  }
	else
	  {
	    build(y->right,x->right,mid+1,r,t);
	    y->left=x->left;
	    y->updata();
	  }
}
void find(node *x1,node *x2,int l,int r,int k)
{
	int ls;
	if (x1==NULL) x1=null; if (x2==NULL) x2=null;
	ls=0;
	if (l==r) {ans=b[l]; return;}
	if (x2->left) ls+=x2->left->size;
	if (x1->left) ls-=x1->left->size;
	if (ls>=k) find(x1->left,x2->left,l,mid,k);
	else find(x1->right,x2->right,mid+1,r,k-ls);
}
int main()
{
	int i,size,x,l,r,k;
	freopen("kth.in","r",stdin);
	freopen("kth.out","w",stdout);
	scanf("%d%d",&n,&m);
	null->left=null; null->right=null;
	for (i=1;i<=n;++i)
	  {
	    scanf("%d",&a[i]);
	    b[i]=a[i];
	  }
	sort(b+1,b+n+1);
	size=unique(b+1,b+n+1)-b-1;
	temp=0;
	for (i=1;i<=n;++i)
	  build(root[i],root[i-1],1,size,a[i]);
	for (i=1;i<=m;++i)
	  {
	    scanf("%d%d%d",&l,&r,&k);
	    ans=0; find(root[l-1],root[r],1,size,k);
	    printf("%d\n",ans);
	  }
	fclose(stdin);
	fclose(stdout);
}

动态主席树,其实救是树状数组套线段树,COGS 257 动态排名系统 code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mid (l+r)/2
using namespace std;
struct hp{
	int size,l,r;
}tree[10000001];
struct hq{
	char op;
	int x,y,k;
}qst[10001];
int t,n,m,tot,size;
int root[50001],a[50001],b[60001],q1[2000],q2[2000];
int lowbit(int x) {return x&(-x); }
void build(int &x,int l,int r)
{
	tree[x=++tot].size=0;
	if (l==r) return;
	build(tree[x].l,l,mid); 
	build(tree[x].r,mid+1,r);
}
void insert(int last,int &i,int l,int r,int x,int flag)
{
	tree[i=++tot].size=tree[last].size+flag;
	tree[i].l=tree[last].l; tree[i].r=tree[last].r;
	if (l==r) return;
	if (x<=mid) insert(tree[last].l,tree[i].l,l,mid,x,flag);
	else insert(tree[last].r,tree[i].r,mid+1,r,x,flag);
}
void bit_ins(int i,int x,int flag)
{
	for (;i<=n;i+=lowbit(i)) insert(root[i],root[i],1,size,x,flag);
}
int ask(int l,int r,int k)
{
	int ss=0,i;
	if (l==r) return l;
	for (i=1;i<=q2[0];++i) ss+=tree[tree[q2[i]].l].size;
	for (i=1;i<=q1[0];++i) ss-=tree[tree[q1[i]].l].size;
	if (k<=ss)
	  {
	    for (i=1;i<=q2[0];++i) q2[i]=tree[q2[i]].l;
	    for (i=1;i<=q1[0];++i) q1[i]=tree[q1[i]].l;
	    return ask(l,mid,k);
	  }
	else
	  {
	    for (i=1;i<=q2[0];++i) q2[i]=tree[q2[i]].r;
	    for (i=1;i<=q1[0];++i) q1[i]=tree[q1[i]].r;
	    return ask(mid+1,r,k-ss);
	  }
}
int bit_ask(int l,int r,int k)
{
	q2[0]=q1[0]=0;
	for (;r;r-=lowbit(r)) q2[++q2[0]]=root[r];
	for (;l;l-=lowbit(l)) q1[++q1[0]]=root[l];
	return ask(1,size,k);
}
int main()
{
	int i,j;
	freopen("dynrank.in","r",stdin);
	freopen("dynrank.out","w",stdout);
	scanf("%d",&t);
	while (t)
	  {
	    memset(root,0,sizeof(root));
	    memset(tree,0,sizeof(tree));
	    tot=0; b[0]=0; 
	    scanf("%d%d",&n,&m);
	    for (i=1;i<=n;++i)
	      {
	        scanf("%d",&a[i]);
	        b[0]++;b[b[0]]=a[i];
	      }
        for (i=1;i<=m;++i)
          {
            scanf("%*c%c",&qst[i].op);
            if (qst[i].op=='Q')
              scanf("%d%d%d",&qst[i].x,&qst[i].y,&qst[i].k);
            else
              {
                scanf("%d%d",&qst[i].x,&qst[i].k);
                b[0]++; b[b[0]]=qst[i].k;
              }
          }
        sort(b+1,b+b[0]+1);
        size=unique(b+1,b+b[0]+1)-b-1;
        build(root[0],1,size);
        for (i=1;i<=n;++i) 
          {
            a[i]=upper_bound(b+1,b+size+1,a[i])-b-1;
            bit_ins(i,a[i],1);
          }
        for (i=1;i<=m;++i)
          {
            if (qst[i].op=='Q')
              {
                j=bit_ask(qst[i].x-1,qst[i].y,qst[i].k);
                printf("%d\n",b[j]);
              }
            else
              {
                bit_ins(qst[i].x,a[qst[i].x],-1);
                a[qst[i].x]=upper_bound(b+1,b+size+1,qst[i].k)-b-1;
                bit_ins(qst[i].x,a[qst[i].x],1);
              }
          }
        t--;
	  }
	fclose(stdin);
	fclose(stdout);
}

其实稍微转化一下就成模板题啦~~ code:

#include<iostream>
#include<cstdio>
#include<cstring>
#define mid (l+r)/2
using namespace std;
struct hp{
	int size,l,r;
}tree[10000000];
int root[100001],q1[2000],q2[2000],n,m;
int a[100001],a2[100001],c[100001],pos[100001],tot,del[100001];
long long ansi[50001]={0};
int lowbit(int x) { return x&(-x); }
long long work(int l,int r)
{
	int i,j;
	int ans=0;
	if (l==r) return ans;
	ans+=work(l,mid)+work(mid+1,r);
	i=l; j=mid+1; c[0]=0;
	while (i<=mid&&j<=r)
	  {
	    if (a2[i]<a2[j])
	      {
	        c[++c[0]]=a2[i];
	        i++;
	      }
	    else
	      {
	        c[++c[0]]=a2[j]; j++;
	        ans+=mid-i+1;
	      }
	  }
	for (;i<=mid;++i) c[++c[0]]=a2[i];
	for (;j<=r;++j) c[++c[0]]=a2[j];
	for (i=l;i<=r;++i) a2[i]=c[i-l+1];
	return ans;
}
void build(int &x,int l,int r)
{
	tree[x=++tot].size=0;
	if (l==r) return;
	build(tree[x].l,l,mid); 
	build(tree[x].r,mid+1,r);
}
long long askless(int l,int r,int x)
{
	int ss=0;
	int i;
	if (l==r) return 0;
	for (i=1;i<=q2[0];++i) ss+=tree[tree[q2[i]].l].size;
	for (i=1;i<=q1[0];++i) ss-=tree[tree[q1[i]].l].size;
	if (x<=mid)
	  {
	    for (i=1;i<=q2[0];++i) q2[i]=tree[q2[i]].l;
	    for (i=1;i<=q1[0];++i) q1[i]=tree[q1[i]].l;
	    return askless(l,mid,x);
	  }
	else
	  {
	    for (i=1;i<=q2[0];++i) q2[i]=tree[q2[i]].r;
	    for (i=1;i<=q1[0];++i) q1[i]=tree[q1[i]].r;
	    return ss+askless(mid+1,r,x);  
	  }
}
long long askmore(int l,int r,int x)
{
	int ss=0;
	int i;
	if (l==r) return 0;
	for (i=1;i<=q2[0];++i) ss+=tree[tree[q2[i]].r].size;
	for (i=1;i<=q1[0];++i) ss-=tree[tree[q1[i]].r].size;
	if (x>mid)
	  {
	    for (i=1;i<=q2[0];++i) q2[i]=tree[q2[i]].r;
	    for (i=1;i<=q1[0];++i) q1[i]=tree[q1[i]].r;
	    return askmore(mid+1,r,x);
	  }
	else
	  {
	    for (i=1;i<=q2[0];++i) q2[i]=tree[q2[i]].l;
	    for (i=1;i<=q1[0];++i) q1[i]=tree[q1[i]].l;
	    return ss+askmore(l,mid,x);  
	  }
}
long long bit_askless(int l,int r,int x)
{
	q1[0]=q2[0]=0;
	for (;l;l-=lowbit(l)) q1[++q1[0]]=root[l];
	for (;r;r-=lowbit(r)) q2[++q2[0]]=root[r];
	askless(1,n,x);
}
long long bit_askmore(int l,int r,int x)
{
	q1[0]=q2[0]=0;
	for (;l;l-=lowbit(l)) q1[++q1[0]]=root[l];
	for (;r;r-=lowbit(r)) q2[++q2[0]]=root[r];
	askmore(1,n,x);
}
void insert(int last,int &i,int l,int r,int x,int flag)
{
	if (!i) i=++tot;
	tree[i].size=tree[last].size+flag;
	tree[i].l=tree[last].l; tree[i].r=tree[last].r;
	if (l==r) return; 
	if (x<=mid) insert(tree[last].l,tree[i].l,l,mid,x,flag);
	else insert(tree[last].r,tree[i].r,mid+1,r,x,flag);
}
void bit_ins(int i,int x,int flag)
{
	for (;i<=n;i+=lowbit(i)) insert(root[i],root[i],1,n,x,flag);
}
int main()
{
	int i; long long ans=0;
	scanf("%d%d",&n,&m); tot=0;
	for (i=1;i<=n;++i)
	  {
	    scanf("%d",&a[i]);
	    pos[a[i]]=i;
      }
    for (i=1;i<=m;++i)
      {
        scanf("%d",&del[i]);
        a[pos[del[i]]]=0;
      }
    build(root[0],1,n);
    for (i=1;i<=n;++i)
      if (a[i])
        {
          bit_ins(i,a[i],1);
		  a2[++a2[0]]=a[i];  
        }
    ans=work(1,a2[0]);
    for (i=m;i>=1;--i)
      {
        bit_ins(pos[del[i]],del[i],1);
        if (pos[del[i]]>1) ans+=bit_askmore(0,pos[del[i]]-1,del[i]); 
        if (pos[del[i]]<n) ans+=bit_askless(pos[del[i]],n,del[i]);   
        ansi[i]=ans;
      }
    for (i=1;i<=m;++i)
      printf("%lld\n",ansi[i]);
}



 

飞书多维表格省钱攻略:1个专业版账号,全员合规用、权限全掌控 像运动馆、 托管班、作业辅导、少儿美术、书法、口才班等等。对于大多数中小团队而言,飞书多维表格的核心需求是“协作高效、数据可控、成本可控”,而“1个专业版账号+多联系人”的模式,恰好完美契合这三点——既不用为不必要的席位付费,又能解锁全部专业功能,还能通过精细化权限管控保障数据安全。尤其是餐饮店、乒乓球训练馆这类个体经营或小型团队,人员分工清晰、权限需求明确,采用这种模式能最大化节省成本,同时提升管理效率。无需复杂的配置,无需额外的技术支持,5分钟就能搭建起全员协作的省钱体系。 阅读详情

相关推荐

LangGraph的容错机制:从节点失败到图级回滚

核心概念铺垫:讲解LLM应用容错与事务性的核心概念(幂等性、重试策略、降级策略、快照、回滚、原子性、一致性、隔离性、持久性、最终一致性),对比LangGraph容错机制与传统数据库ACID事务、Apache Airflow/Kubernetes Workflow/Kubeflow Pipelines容错机制的异同;LangGraph容错机制的演进历史:用markdown表格梳理LangGraph从0.0.1到1.5.0(截止202X年X月)的容错机制发展历程;节点级别的容错:重试与降级。

AI Python 编程之道的博客 172

学习记录5:主席树

嗯 昨天某题TLE了一晚上  搜索优化方式的时候看到了这个  于是 今天学了下 - - 点击打开链接 点击打开链接 觉得上面那个教程的图蛮好的  点击打开链接 这些讲的挺详细的  嗯 说下理解 也不知道算不算正常版  = = 主席树的主体是一棵线段树  有点像是一堆树被拼在一起  共同使用某些部分 嗯 先画张图

ilsswfr 419

LibreNMS实战:5分钟搞定Docker部署与中文配置(附常见问题排查)

本文详细介绍了如何使用Docker在5分钟内快速部署LibreNMS,并完成中文界面优化。从环境准备到容器启动,再到中文语言包安装和系统配置调整,提供了完整的实战指南。同时,文章还包含常见问题排查和性能调优建议,帮助用户高效搭建网络监控系统。

e1f2g的博客 1281

【学习笔记】主席树

1、前置知识 线段树、权值线段树、前缀和思想等 2、引入 主席树模板题 约定: 后面将第k小/大说成kthkthkth 解决什么问题: 给定一段区间,静态求区间kthkthkth 想想方法: 暴力:对于每一个询问,排个序,就行了,时间复杂度O(nmlogn)O(nmlogn)O(nmlogn) 莫队+树状数组:树状数组可以求给定区间kthkthkth,使用二分+树状数组,具体不展开,但是多个区间...

ModestCoder_的博客 1万+

Android WLAN STA/AP 并发

Android 9 引入了可让设备同时在 STA 和 AP 模式下运行的功能。对于支持双频并发 (DBS) 的设备,此功能让一些新功能得以实现,例如在用户想要启用热点 (softAP) 时不会中断 STA WLAN。

华南烹鱼宴 1248

Linux 桌面虚拟化技术 KVM

Linux 桌面虚拟化技术 KVM

高飞的博客 36万+

权值线段树、主席树学习

初学主席树,主要是反复看了卿学姐的视频(我竟然在B站学算法)和知乎“主席树是如何求区间k大的”,才算懂了点皮毛。 传送门: 卿学姐的B站视频 知乎-“主席树是如何求区间k大的” 首先,学习主席树要点的前置技能是权值线段树(卿学姐说的是线段树,个人认为不太确切)。权值线段树之所以会带上“权值”二字,是因为它是记录权值的线段树。因此需要用到离散化操作来处理a[1-n]。记录权值指的是,每...

Stupid_Turtle的博客 9692

Sourcetree与Gitee的完美协作:从身份验证到推送成功的全流程指南

本文提供了一份详细的Sourcetree与Gitee协作全流程指南,重点解决身份验证失败、Git版本配置及远端仓库设置等常见问题。通过分步讲解,帮助用户掌握从克隆、提交到成功推送的完整操作,并整合了使用个人访问令牌进行身份验证等关键热词信息,确保Windows与MacOS用户都能顺畅完成代码管理。

m2n3b4v5c6的博客 710

主席树介绍

函数式(现在又称主席式。。。)数据结构从来都没写过,感觉这个东西可以挖掘出不少东西出来,于是开一组专题。 先根据 Seter 留下的文本做一些记录。。 主席树大概是一种离线结构,我以前反正没看到过这东西,所以就自己给他起名字了!如果谁知道这东西的真名,请告诉我! 现在我们知道,主席树的全名应该是 函数式版本的线段树。加上附带的一堆 technology。。 。。

MetalSeed 4万+

Unity零基础到进阶 ☀️| Unity中的 GC及优化 超级全面解析 ☆(ゝω・)v 建议收藏!

介绍: 在游戏运行的时候,数据主要存储在内存中,当游戏的数据在不需要的时候,存储当前数据的内存就可以被回收以再次使用。内存垃圾是指当前废弃数据所占用的内存,垃圾回收(GC)是指将废弃的内存重新回收再次使用的过程。 Unity中将垃圾回收当作内存管理的一部分,如果游戏中废弃数据占用内存较大,则游戏的性能会受到极大影响,此时垃圾回收会成为游戏性能的一大障碍点。 本文我们主要学习垃圾回收的机制,垃圾回收如何被触发以及如何提GC收效率来提高游戏的性能。 Unity内存管理机制简介 要想了解垃圾回收如何工作以及何时被

努力前行,总会成为自己心中的那道光 6万+

小秋SLAM入门实战ubuntu所有文章汇总

ubuntu 终端如何停止快速打印的输出以及恢复命令 ubuntu 终端如何快速打开当前路径下的图形化窗口界面? killall -9用途用法 ps -xu | grep这个命令的用途 linux 下 top命令显示的是内存是堆内存吗? zip分割和合并 关闭除当前 GNOME 终端窗口以外的所有其他 GNOME 终端窗口 如何在安装系统后设置短密码 【如何使用getrusage获取消耗的CPU时间和进程使用的最大物理内存】 【webots安装使用教程】 Linux系统下查看当前运行的进程和线程的几种方法

小秋 AI SLAM 入门实战教程 1405

主席树+可修改主席树

普通主席树 普通主席树比较简单 就是很多个权值线段树 每一次加进去log个节点(每层一个),剩下的节点用原来的线段树中的节点直接连到新节点上就好了 线段树 插入节点 主席树 主席树拆开之后 POJ2104 主席树模板题 代码: 1 #include<algorithm> 2 #include<cstdio&gt...

aozhuan8489的博客 258

windows 配置 libxml2

路径:\libiconv-1.9.2-1-src.zip\src\libiconv\1.9.2\libiconv-1.9.2\include\。执行完后,在当前win32目录中会生成了一个bin.msvc目录,其中就有开发需要的libxml2.lib和libxml2.dll文件。将 libiconv.la 复制到 新建的 lib 目录,并将其改名为 iconv.lib。路径:libiconv-1.9.2-1-bin.zip\lib\。将如下的 iconv.h 复制到新建的 include 目录。

SHELLCODE_8BIT的博客 3886

主席树

抛出问题 给定\(N\)个数(\(int\)范围内),一共\(M\)次询问,每次都要询问区间\([l,r]\)的第\(k\)大的数。 其中\(N,M,l,r\)均不超过\(2\times 10^5\),保证询问有答案。 点我去模板题 解决问题 暴力法 显而易见,最暴力的办法就是区间排序然后输出排序后第\(k\)个数。最坏情况的时间复杂度是\(O(nm\lg n)\),不超时才怪。 主席树...

GKX328131442的博客 602

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

待修主席树

废话 主席树入门那篇博客至今已经一年半了,然而我现在才写待修主席树。 网上很多人的待修主席树讲的不明白,往往是一句话带过,跟没说区别不大,大家上网搜资料学习当然都是想学的细致一点,那么对于写博客的人来说,自然要负起责任来写的详细一点。 希望这篇博客能给你帮助。 进入正题! 前置芝士——主席树入门。 以前的码风不优秀还请见谅qwq…… 在其他的博客里大家都能看到这样一句话: 普通的主席树记录的是...

a_forever_dream的博客 503

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

主席树讲解

转自:https://blog.youkuaiyun.com/a_forever_dream/article/details/80450549 主席树这个名字特别高大上,而且也是一种很6的高端操作啊,之前一直想学都没时间,最近终于花了一天把他给搞明白了 主席树的来源: 主席树发明者fotile,后人也称其为fotile主席。同时主席树也被叫做可持续化线段树等,因为主席树这个名字显得高贵冷艳,所以现...

zx93的博客 667

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

主席树学习笔记

摘: 主席树思想是每个位置都维护一个线段树,线段树的节点是值的范围,然后第i个线段树中某个区间[x, y]维护的是,1-i中数字在[x, y]范围内的个数。这里利用到了前缀和的思想。 (想学好就得老老实实做笔记,不要相信自己的记忆力。 个人笔记: 关于(静态的)主席树(动态还没学.......): 1,主席树是高级的权值线段树。   权值线段树区别于普通线...

a657285080的博客 147

主席树【学习笔记】

目录引入前置知识一个想法前缀和主席树离散化动态开点 引入 给定一个nnn个数的序列,求序列中[l,r][l,r][l,r]区间范围内第kkk大(小)的数,有其中可能有单点修改操作。 对于该类问题,在学主席树之前,我们一般有以下几种方法: 暴力 整体二分 分块 线段树 以上方法可以参考这篇博客,不作过多解释(主要我也不是很懂)。 前置知识 在讲主席树之前需要了解一下普通线段树和权值线段树的区别 权值线段树,基于普通线段树,但是不同。 举个栗子:对于一个给定的数组,普通线段树可以维护某个子数组中数的和,

Outer_Space_的博客 489

主席树 总结

主席树 (总结主要是为了给自己看,了解用法,主席树的基本原理和写法请出门左转dalao多多) 思路 在之前写博客的时候曾经说了一句,【线段树的可减性】,用这句话来解释线段树的原理。在之后的学习过程中发现这句话不太准确。 主席树即可持久化线段树,它可以记录对线段树修改过程中,每一次修改时的状态,方便之后回退回当前状态。而同时,对于每一次修改,我们通过节点的重用,尽可能得减少空间开销,因为在单点修改时...

ShadowGhostH的博客 337

主席树的学习

前言 主席树可真是个好东西 之前一直都觉得挺难的 今天一看 woc这么简单! 怎么可能,我还是太蒟蒻了 感谢akakw1大佬的指导! 一.前置知识及算法思路 1.可持久化 因为主席树是可持久化线段树,所以还是有必要了解一下可持久化 可持久化的数据结构是可以支持访问任一历史版本的信息(也就是每一次修改操作之前的情况) 2.如何实现 以可持久化线段树为...

YT910811的博客 129

主席树 学习笔记

主席树 主席树就是权值线段树的一个集合; 模板题为求某个区间的第 K 大,权值线段树也有求第 K 大这个功能,但是不能维护区间,只能求整个全局第 K 大; 所以学习这个之前,务必先搞懂权值线段树; 所以代码都是这道题的; 【模板】可持久化线段树 1(主席树) 1、先从建树开始说起: int build(int l,int r){ int rt=++root; int d=(l+r)>&g...

不知所云的博客 226

主席树理解

主席树(可持久化权值线段树) 前置知识:线段树、权值线段树、离散化、前缀和。 简单回顾 线段树 众所周知,线段树是用来维护区间信息的最常用方法之一,其核心思想在于用分治在的时间内来预处理区间信息,同时用logloglog的时间来进行区间查询和修改。还没有完全理解线段树的同学希望自己先多花时间去从根本上理解线段树的思维,不然后面可能会一直懵圈到底。 离散化 当有些数据因为本身很大或者类型不支持,自身无法作为数组的下标来方便地处理,而影响最终结果的只有元素之间的相对大小关系时,我们可以将原来的数据按照从大到小编

hzerotole的博客 239
上一篇: 最小路径覆盖问题
下一篇: 【BZOJ 3110】【ZJOI 2013】K大数查询
Lcomyn
博客等级 码龄12年 14粉丝 74原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值