然而过不去你谷的模板

思路:

值域线段树\([l,r]\)代表一棵值域在\([l,r]\)范围内的点构成的一颗平衡树

平衡树的\(BST\)权值为点在序列中的位置

查询区间第\(k\)大值时

左区间在\([l,r]\)范围内的树的大小与\(k\)比较

大了进去,小了减掉换一边

关于建树

递归建估计是\(O(nlog^2n)\)的


Code:

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
const int N=1e5+10;
int ch[N*20][2],val[N*20],siz[N*20],pos[N*20],root[N<<2],tot;
#define ls ch[now][0]
#define rs ch[now][1]
int n,m,n_,a[N],b[N];
void updata(int now){siz[now]=siz[ls]+siz[rs]+1;}
void split(int now,int k,int &x,int &y)
{
if(!now) {x=y=0;return;}
if(pos[now]<=k)
x=now,split(rs,k,rs,y);
else
y=now,split(ls,k,x,ls);
updata(now);
}
int Merge(int x,int y)
{
if(!x||!y) return x+y;
if(val[x]<val[y])
{
ch[x][1]=Merge(ch[x][1],y);
updata(x);
return x;
}
else
{
ch[y][0]=Merge(x,ch[y][0]);
updata(y);
return y;
}
}
int New(int k)
{
val[++tot]=rand(),pos[tot]=k,siz[tot]=1;
return tot;
}
void Insert(int id,int k)
{
int x,y;
split(root[id],k,x,y);
root[id]=Merge(x,Merge(New(k),y));
}
int ask(int id,int l,int r)//询问区间
{
int x,y,z,s;
split(root[id],r,x,y);
split(x,l-1,x,z);
s=siz[z];
root[id]=Merge(x,Merge(z,y));
return s;
}
std::vector <int> loc[N];
void build(int id,int l,int r)
{
if(l==r)
{
for(int i=0;i<loc[l].size();i++)
Insert(id,loc[l][i]);
return;
}
int mid=l+r>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
for(int i=l;i<=r;i++)
for(int j=0;j<loc[i].size();j++)
Insert(id,loc[i][j]);
}
int query(int id,int l,int r,int ql,int qr,int k)
{
if(l==r) return a[l];
int mid=l+r>>1,cnt;
if((cnt=ask(id<<1,ql,qr))>=k)
return query(id<<1,l,mid,ql,qr,k);
else
return query(id<<1|1,mid+1,r,ql,qr,k-cnt);
}
void init()
{
scanf("%d%d",&n_,&m);
for(int i=1;i<=n_;i++) scanf("%d",a+i),b[i]=a[i];
std::sort(a+1,a+1+n_);
n=std::unique(a+1,a+1+n_)-a-1;
for(int i=1;i<=n_;i++)
loc[std::lower_bound(a+1,a+1+n,b[i])-a].push_back(i);
build(1,1,n);
}
void work()
{
for(int l,r,k,i=1;i<=m;i++)
{
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",query(1,1,n,l,r,k));
}
}
int main()
{
init(),work();
return 0;
}

2018.9.2

静态区间第k大 树套树解法的更多相关文章

  1. 静态区间第k大(归并树)

    POJ 2104为例 思想: 利用归并排序的思想: 建树过程和归并排序类似,每个数列都是子树序列的合并与排序. 查询过程,如果所查询区间完全包含在当前区间中,则直接返回当前区间内小于所求数的元素个数, ...

  2. POJ 2104 && POJ 2761 (静态区间第k大,主席树)

    查询区间第K大,而且没有修改. 使用划分树是可以做的. 作为主席树的入门题,感觉太神奇了,Orz /* *********************************************** ...

  3. 静态区间第k大(主席树)

    POJ 2104为例(主席树入门题) 思想: 可持久化线段树,也叫作函数式线段树,也叫主席树(高大上). 可持久化数据结构(Persistent data structure):利用函数式编程的思想使 ...

  4. 静态区间第k大(划分树)

    POJ 2104为例[经典划分树问题] 思想: 利用快速排序思想, 建树时将区间内的值与区间中值相比,小于则放入左子树,大于则放入右子树,如果相等则放入左子树直到放满区间一半. 查询时,在建树过程中利 ...

  5. poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 43315   Accepted: 14296 Ca ...

  6. 主席树(静态区间第k大)

    前言 如果要求一些数中的第k大值,怎么做? 可以先就这些数离散化,用线段树记录每个数字出现了多少次. ... 那么考虑用类似的方法来求静态区间第k大. 原理 假设现在要有一些数 我们可以对于每个数都建 ...

  7. 可持久化线段树(主席树)——静态区间第k大

    主席树基本操作:静态区间第k大 #include<bits/stdc++.h> using namespace std; typedef long long LL; ,MAXN=2e5+, ...

  8. HDU3473--Minimum Sum(静态区间第k大)

    Minimum Sum Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  9. 主席树学习笔记(静态区间第k大)

    题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输出 ...

随机推荐

  1. centos7编译安装lamp实现wordpress

    准备安装包,并解压 mariadb-10.3.13.tar.gz  ,php-7.3.2.tar.bz2  ,httpd-2.4.38.tar.bz2  php-7.3.2 ,  phpMyAdmin ...

  2. Centos下使用Docker部署asp.net core项目

    本文讲述 CentOS 系统 Docker 中部署 asp.net core开源项目 abp 的过程 步骤 1. 拉取 asp.net core 基础镜像 docker pull microsoft/ ...

  3. 继续分享shell 之变量使用

    变量类型 运行shell时,会同时存在三种变量: 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量. 2) 环境变量 所有的程序,包括 ...

  4. NuGet管理和还原程序包

    在很多开源的程序下载下来不能使用,一般都是平台X86 和X64没有修改,还一个就是程序缺少资源包文件.用Nuget还原即可: 一般建议先修改好平台,然后用NuGet还原程序包.

  5. 课时68.id选择器(掌握)

    1.什么是id选择器? 作用:根据指定的id名称找到对应的标签,然后设置属性 格式: #id名称{ 属性:值; } 注意点: 1.每个html标签都有一个属性叫做id,也就是说每个标签都可以设置id ...

  6. 【Effective c++ 读书笔记】条款01 视 C++ 为一个语言联邦

    一开始,C++只是 C 加上一些面向对象的特性.C++最初的名称 C with Classes 也反映了这个血缘关系. 但是,现在,当这个语言逐渐成熟,它变得更活跃更无拘束,更大胆冒险,开始接受不同于 ...

  7. PHP提取奇数或偶数下标元素

    该功能主要用到 array_filter() 函数,这个函数可以用回调函数过滤数组中的单元.用法: array array_filter ( array $array [, callable $cal ...

  8. Mysql 索引 简介

    Mysql索引 索引的分类 索引的创建 索引的注意事项 什么是索引 索引是存储引擎用于快速查找记录的一种数据结构. 索引由数据库中一列或者多列组成,作用是提高表的查询速度. 索引的优点,提高检索数据的 ...

  9. centos安装xfce及输入法

    一.执行CentOS7 最小安装 去官网 https://www.centos.org/ 下载CentOS-7-x86_64-Minimal-1804.iso,然后使用rufus刻录U盘,安装之.安装 ...

  10. 微信小程序 | 51,live新课“小程序UI容器组件”的课堂计划

    零基础前端自学入门:小程序UI容器组件 这是一节以UI布局.容器组件的使用为主题的live,专注于布局与容器这一个点,努力把这一点讲透.这是继4月22日整体入门live“零基础周末学习小程序开发”之后 ...