luogu3834 【模板】可持久化线段树1(主席树)
关键字:线段树 可持久化
线段树:当版本(即对应的原序列的区间[1,r])一定时,每个节点的left,right下标为值域,值为其对应的原序列区间[1,r]中元素大小在值域中的元素个数。
可持久化:新版本(对应原序列[1,r])在旧版本(对应原序列[1,r-1])上建立,从树根向树叶构造,在旧版本的节点的旁边构造新版本的节点,值为旧版本节点值+1。搜索新版本树时,从新版本树根开始搜索即可。求区间第k大,同时遍历【1,l-1】对应版本树和【1,r】对应版本树,通过节点值的差来得到第k个节点。
#include <cstdio>
#include <cstring>
#include <cassert>
#include <cmath>
#include <algorithm>
using namespace std; #define LOOP(i,n) for(int i=1; i<=n; i++)
#define INF 0x3f3f3f3f
const int MAX_ROOT=2e5;
int Seq[MAX_ROOT]; struct Node
{
int Cnt;
Node *LeftSon, *RightSon;
Node()
{
Cnt = ;
LeftSon = RightSon = NULL;
}
}; Node *_roots[MAX_ROOT];
int _vCount;
int MinL, MaxR; void Init(int l, int r)
{
_vCount = ;
MinL = l;
MaxR = r;
_roots[] = new Node();
} Node *Update(Node *prev, Node *&cur, int l, int r, int p)
{
cur = new Node();
*cur = *prev;
cur->Cnt++;
if (l == r)
return cur;
int mid = (r - l) / + l;
if (p <= mid)
{
if (!prev->LeftSon)
prev->LeftSon = new Node();
Update(prev->LeftSon, cur->LeftSon, l, mid, p);
}
else
{
if (!prev->RightSon)
prev->RightSon = new Node();
Update(prev->RightSon, cur->RightSon, mid + , r, p);
}
return cur;
} int Query(Node *prev, Node *cur, int l, int r, int k)
{
if (l == r)
return l;
int prevLeft = prev->LeftSon ? prev->LeftSon->Cnt : , curLeft = cur->LeftSon ? cur->LeftSon->Cnt : ;
int leftCnt = curLeft - prevLeft;
int mid = (r - l) / + l;
if (k <= leftCnt)
{
if (!prev->LeftSon)
prev->LeftSon = new Node();
return Query(prev->LeftSon, cur->LeftSon, l, mid, k);
}
else
{
if (!prev->RightSon)
prev->RightSon = new Node();
return Query(prev->RightSon, cur->RightSon, mid + , r, k - leftCnt);
}
} void Update(int r)
{
Update(_roots[r - ], _roots[r], MinL, MaxR, Seq[r]);
} int Query(int l, int r, int k)
{
return Query(_roots[l - ], _roots[r], MinL, MaxR, k);
} int main()
{
#ifdef _DEBUG
freopen("c:\\noi\\source\\input.txt", "r", stdin);
#endif
int seqCnt, queryCnt, l, r, k, minL = INF, maxR = -INF;
scanf("%d%d", &seqCnt, &queryCnt);
LOOP(i, seqCnt)
{
scanf("%d", i + Seq);
minL = min(Seq[i], minL);
maxR = max(Seq[i], maxR);
}
Init(minL, maxR);
LOOP(i, seqCnt)
Update(i);
LOOP(i, queryCnt)
{
scanf("%d%d%d", &l, &r, &k);
printf("%d\n", Query(l, r, k));
}
return ;
}
luogu3834 【模板】可持久化线段树1(主席树)的更多相关文章
- P3919 【模板】可持久化数组 -初步探究主席树
本篇blog主要是给自己(大家)看的. 感谢longlongzhu123奆佬(此人初二LCT)的指点,使本蒟蒻可以快速开始主席树入门. what is 主席树? $ $主席树这个名字只不 ...
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- POJ 2104 K-th Number(分桶,线段树,主席树)
一道比较经典的数据结构题.可以用多种方式来做. 一,分桶法(平方分解). 根据数字x的大小和区间内不大于x的数字数量cnt的单调性,可知第k大数kth对应的cnt应该满足cnt≥k, 且kth是满足条 ...
- 【题解】BZOJ3489 A Hard RMQ problem(主席树套主席树)
[题解]A simple RMQ problem 占坑,免得咕咕咕了,争取在2h内写出代码 upd:由于博主太菜而且硬是要用指针写两个主席树,所以延后2hQAQ upd:由于博主太菜而且太懒所以他决定 ...
- poj 2104 K-th Number 划分树,主席树讲解
K-th Number Input The first line of the input file contains n --- the size of the array, and m --- t ...
- 【BZOJ4771】七彩树(主席树)
[BZOJ4771]七彩树(主席树) 题面 BZOJ 题解 如果没有深度限制,每次只询问子树内的颜色个数,除了树套树\(dfs\)序加前驱或者后继强行二维数点之外,还有这样一种做法: 把所有相同颜色的 ...
- 洛谷P3248 树 [HNOI2016] 主席树+倍增+分治
正解:主席树+倍增+分治 解题报告: 传送门! 首先看到这题会想到之前考过的这题 但是那题其实简单一些,,,因为那题只要用个分治+预处理就好,只是有点儿思维难度而已 这题就不一样,因为它说了是按照原树 ...
- BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树
BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树 题意: 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastan ...
- POJ 2761 Feed the dogs(平衡树or划分树or主席树)
Description Wind loves pretty dogs very much, and she has n pet dogs. So Jiajia has to feed the dogs ...
- 【洛谷P3834】(模板)可持久化线段树 1(主席树)
[模板]可持久化线段树 1(主席树) https://www.luogu.org/problemnew/show/P3834 主席树支持历史查询,空间复杂度为O(nlogn),需要动态开点 本题用一个 ...
随机推荐
- P1538 迎春舞会之数字舞蹈
题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...
- Android O Bitmap 内存分配
我们知道,一般认为在Android进程的内存模型中,heap分为两部分,一部分是native heap,一部分是Dalvik heap(实际上也是native heap的一部分). Andro ...
- Android studio & SDK的国内有效站点。
SDK.TOOLS的国内有效镜像节点: mirrors.zzu.edu.cn/android/repository/ 网上的地址只写了mirrors.zzu.edu.cn,有误,需要补齐后面的子目录才 ...
- Jupyter(Ipython) Notebook 入门
upyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言. 一般用来编写漂亮的交互式文档. 文学编程的读者不是机器,而是人. 我们 ...
- 支付宝小程序日期选择组件datePicker封装
github 地址 https://github.com/iocool/antminDatePicker 最近在做支付宝小程序(以下简称小程序)开发,发现小程序的日期选择组件很不好用,比如安卓和IOS ...
- CSS平滑过渡动画:transition
<html> <head> <link href="http://cdn.bootcss.com/twitter-bootstrap/3.0.2/css/boo ...
- HDU_2212_水
DFS Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- Random同时生成多个随机数
贴一个简单示例 public DataTable selectStuInfo() { DataTable dt = new DataTable(); dt.Columns.Add("姓名&q ...
- Centos初始化硬盘分区、挂载
刚刚买了一台服务器,刚买的服务器的数据盘都是需要自己来分区的,下面就记录一下操作. 通过命令fdisk-l查看硬盘信息 可以看到有两块硬盘/dev/vda和/dev/vdb,启动vda是系统盘vdb是 ...
- 【python】详解numpy库与pandas库axis=0,axis= 1轴的用法
对数据进行操作时,经常需要在横轴方向或者数轴方向对数据进行操作,这时需要设定参数axis的值: axis = 0 代表对横轴操作,也就是第0轴: axis = 1 代表对纵轴操作,也就是第1轴: nu ...