首页 > 其他分享 >可持久化线段树-主席树

可持久化线段树-主席树

时间:2022-11-01 15:35:49浏览次数:34  
标签:begin return nums int 线段 mid build 持久 主席

求第k小数

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int M=1e4+10;
vector<int>nums;
int n,m;
int a[N];
int root[N];
int idx;

struct tree
{
	int l,r;
	int cnt;
}t[N*21];


int find(int x)
{
	return lower_bound(nums.begin(),nums.end(),x)-nums.begin();
}

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

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

int query(int p,int q,int l,int r,int k)
{
	if(l==r) return r;
	int cnt=t[t[q].l].cnt-t[t[p].l].cnt;
	int mid=(l+r)>>1;
	if(k<=cnt) return query(t[p].l,t[q].l,l,mid,k);
	else return query(t[p].r,t[q].r,mid+1,r,k-cnt);
}

int main(){
	
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i],nums.push_back(a[i]);
	sort(nums.begin(),nums.end());
	nums.erase(unique(nums.begin(),nums.end()),nums.end());
	
	root[0]=build(0,nums.size()-1);
	
	for(int i=1;i<=n;i++)
	{
		root[i]=insert(root[i-1],0,nums.size()-1,find(a[i]));
	}
	
	while(m--)
	{
		int l,r,k;
		cin>>l>>r>>k;
		printf("%d\n",nums[query(root[l-1],root[r],0,nums.size()-1,k)]);
	}
	
	return 0;
}

标签:begin,return,nums,int,线段,mid,build,持久,主席
From: https://www.cnblogs.com/mrkou/p/16847855.html

相关文章

  • 最长不下降子序列(线段树优化dp)
    最长不下降子序列题目大意:给定一个长度为N的整数序列:A\(_{1}\),A\(_{2}\),⋅⋅⋅,A\(_{N}\)。现在你有一次机会,将其中连续的K个数修改成任意一个相同值。请你计......
  • 扫描线-线段树
    求面积并#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=1e6+10;intn;intX[N*2];structsegment{ intl,r,h,val;}seg[N*2]......
  • CF487E Tourists(Tarjan,圆方树,树链剖分,线段树)
    CF487ETourists带权无向图\(N,M\),\(Q\)次询问\(s,t\)所有不经过重复点可能路径经过的最小值的最小值。CODE每次修改一个圆点\(u\)周围的方点有点难。可是李神......
  • 线段树中递归
    楼房重建题目描述小A的楼房外有一大片施工工地,工地上有\(N\)栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少......
  • 三个状态之间的转换和持久太对象自动更新的能力测试
      ......
  • Redis学习十一:Redis持久化
    文章目录​​一、RDB(RedisDataBase)​​​​1.1触发机制​​​​1.2如果恢复rdb文件!​​​​1.3优缺点​​​​二、AOF(AppendOnlyFile)​​​​2.1是什么​​​​2.2appen......
  • 【XSY4191】sequence(分块,线段树)
    题面sequence题解考虑把原序列每\(k\)位分成一段,然后对于每一段维护起点在这一段中的最小值。先考虑询问,对于起点在中间的整段我们直接线段树查区间最小值,现在考虑两......
  • 【XSY4041】搬砖(线段树)
    题面搬砖题解题意为求最大的\(p\)使得\(h_1\equivh_2\equiv\cdots\equivh_n\pmodp\)。即\(h_2-h_1\equivh_3-h_2\equiv\cdots\equivh_n-h_{n-1}\equiv0\pm......
  • iOS数据持久化 - CoreData
    前言1-CoreData是苹果公司封装的进行数据持久化的框架,首次在iOS3.0版本系统中出现,它允许按照实体-属性-值模型组织数据,并以XML、二进制文件或者SQLite数据文件的......
  • P1803 凌乱的yyy / 线段覆盖
    题目背景快noip了,yyy很紧张!题目描述现在各大oj上有 nn 个比赛,每个比赛的开始、结束的时间点是知道的。yyy认为,参加越多的比赛,noip就能考的越好(假的)。所以......