主席树区间第K大
主席树的实质其实还是一颗线段树, 然后每一次修改都通过上一次的线段树,来添加新边,使得每次改变就改变logn个节点,很多节点重复利用,达到节省空间的目的。
1.不带修改的区间第K大。
代码:
#include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const LL mod = 1e9+;
const int N = 1e5+;
struct Node{
int l, r;
int num;
}tree[N*];
int tot = ;
int root[N];
int Rank[N];
int b[N];
struct N{
int a;
int id;
bool operator < (const N & x) const{
return a < x.a;
}
}A[N]; int Build(int l, int r){
int now = ++tot;
tree[now].num = ;
if(l == r) return now;
int m = l+r >> ;
tree[now].l = Build(l,m);
tree[now].r = Build(m+,r);
return now;
}
int update(int pre, int l, int r, int k){
int now = ++tot;
tree[now].num = ;
tree[now].l = tree[pre].l;
tree[now].r = tree[pre].r;
if(l < r) {
int m = l+r >> ;
if(k <= m) tree[now].l = update(tree[pre].l ,l, m, k);
else tree[now].r = update(tree[pre].r, m+, r, k);
tree[now].num = tree[tree[now].l].num + tree[tree[now].r].num;
}
else tree[now].num = ;
return now;
}
int query(int u, int v, int l, int r,int k){
if(l == r) return l;
int m = l+r >> ;
int num1 = tree[tree[v].l].num - tree[tree[u].l].num;
if(num1 >= k) return query(tree[u].l, tree[v].l, l, m, k);
return query(tree[u].r, tree[v].r, m+,r,k-num1);
}
int main(){
///Fopen;
int t, n, m;
scanf("%d", &t);
while(t--){
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++){
scanf("%d", &A[i].a);
A[i].id = i;
}
sort(A+, A++n); /// 离散化
int t = ;
A[].a = -;
for(int i = ; i <= n; i++){
if(A[i].a != A[i-].a) t++, Rank[t] = A[i].a;
b[A[i].id] = t;
}
tot = ;
root[] = Build(,t);
for(int i = ; i <= n; i++)
root[i] = update(root[i-], , t, b[i]);
while(m--){
int l, r, k;
scanf("%d%d%d", &l, &r, &k);
printf("%d\n", Rank[query(root[l-], root[r],, t, k)]);
}
}
return ;
}
/*
1
10 1
1 4 2 3 5 6 7 8 9 0
1 3 2 */
主席树区间第K大的更多相关文章
- POJ 2104 K-th Number 主席树(区间第k大)
题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...
- HDU 6278 主席树(区间第k大)+二分
Just h-index Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)To ...
- zoj2112 主席树动态第k大 (主席树&&树状数组)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- 牛客多校第九场H Cutting Bamboos(主席树 区间比k小的个数)题解
题意: 标记为\(1-n\)的竹子,\(q\)个询问,每次给出\(l,r,x,y\).要求为砍区间\(l,r\)的柱子,要求砍\(y\)次把所有竹子砍完,每次砍的时候选一个高度,把比他高的都砍下来,并 ...
- zoj2112 主席树动态第k大 ( 参考资料链接)
参考链接: http://blog.csdn.net/acm_cxlove/article/details/8565309 http://www.cnblogs.com/Rlemon/archive/ ...
- ZOJ2112--Dynamic Rankings (动态区间第k大)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- hdu 5919--Sequence II(主席树--求区间不同数个数+区间第k大)
题目链接 Problem Description Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2 ...
- hdu 5919 主席树(区间不同数的个数 + 区间第k大)
Sequence II Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- zoj2112 树状数组+主席树 区间动第k大
Dynamic Rankings Time Limit: 10000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu Subm ...
随机推荐
- 消息中间件——RabbitMQ(一)Windows/Linux环境搭建(完整版)
前言 最近在学习消息中间件--RabbitMQ,打算把这个学习过程记录下来.此章主要介绍环境搭建.此次主要是单机搭建(条件有限),包括在Windows.Linux环境下的搭建,以及RabbitMQ的监 ...
- 【JDK】JDK源码分析-AbstractQueuedSynchronizer(1)
概述 前文「JDK源码分析-Lock&Condition」简要分析了 Lock 接口,它在 JDK 中的实现类主要是 ReentrantLock (可译为“重入锁”).ReentrantLoc ...
- Mac OS 安装mysqlclient 遇到的坑~
最近在学习Python, 因为Django连接mysql 需要安装mysqlclient, 但Mac安装遇到各种问题,这里记录一下,避免以后再踩坑. 1. 正常情况下,安装mysqlclient ...
- Redis总结(八)如何搭建高可用的Redis集群
以前总结Redis 的一些基本的安装和使用,大家可以这这里查看Redis 系列文章:https://www.cnblogs.com/zhangweizhong/category/771056.html ...
- java随笔之接口
/* * 接口大致上可以分为:哑接口,抽象接口,接口类 * 哑接口:就是public,protected(注意protect有包权限,只有本包才开放接口)方法 * 抽象接口:就是哑接口变为抽象方法,在 ...
- TI MSP430工程配置及2019年电赛A题编程示例(使用430 F5529)
配置 第一步:右击工程,选择Options 第二步:在General Options的Target选项卡里选择对应的器件Device,这里是MSP430G2231 第三步:在Debugger里选择FE ...
- CSS3 Flex 布局教程
网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂 ...
- Spider & CrawlSpider
CrawlSpide 最重要的是分析源码官方文档百度收搜 Spider document 就是官方文档了1.3的源码分析CrawlSpide 是爬取一个网站常用的规则 它是对spider进一步的包装 ...
- java 购物商城小项目训练
java web 模拟购物车练习(项目一) 首页(index.jsp) <div align="center" class="index"> < ...
- 使用CefSharp在.NET中嵌入Chromium
使用CefSharp可以在.NET轻松的嵌入Html,不用担心WPF与Winform 控件与它的兼容性问题,CefSharp大部分的代码是C#,它可以在VB或者其他.NET平台语言中来进行使用. 近几 ...