题目描述(口糊)

先给定一个长度为n的数列,然后给m次操作,每次输入b,求第b小的数。

样例输入

5
7 4 10 9 23
5
1
2
3
4
5

样例输出

4
7
9
10
23

数据范围及温馨提示

1e9 大家一定要用线段树做这道题啊!

建议大家在认真阅读一下逆序对的题解

题解传送门

于是这里我们只需要把query改一下其实就可以了。

int query(int k,int cnt)
{
if(node[k].l==node[k].r) return node[k].l;
if(cnt<=node[node[k].son[0]].cnt) return query(node[k].son[0],cnt);
else return query(node[k].son[1],cnt-node[node[k].son[0]].cnt);
}

其他都一样,我用的是动态开点。

整体代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
struct sd{
int son[2];
long long l,r,cnt;
}node[N];
int n;
int cnt=1;
long long ans;
void update(int k)
{
node[k].cnt=node[node[k].son[0]].cnt+node[node[k].son[1]].cnt;
}
void modify(int k,int val)
{
if(node[k].l==node[k].r&&node[k].l==val)
{
node[k].cnt++;
return;
}
int mid=node[k].l+node[k].r;mid/=2;
if(node[k].son[0]==0)
{
cnt++;
node[k].son[0]=cnt;
node[cnt].l=node[k].l;node[cnt].r=mid;
}
if(node[k].son[1]==0)
{
cnt++;
node[k].son[1]=cnt;
node[cnt].l=mid+1;node[cnt].r=node[k].r;
}
if(val>mid)
{
modify(node[k].son[1],val);
}
else
{
modify(node[k].son[0],val);
}
update(k);
}
/*long long query(int k,int ql,int qr)
{
if(k==0) return 0;
if(node[k].l==ql&&node[k].r==qr)
{
return node[k].cnt;
}
else
{
int mid=(node[k].l+node[k].r)/2;
if(qr<=mid) return query(node[k].son[0],ql,qr);
else if(ql>mid) return query(node[k].son[1],ql,qr);
else
{
return query(node[k].son[0],ql,mid)+query(node[k].son[1],mid+1,qr);
}
}
}*/
long long query(int k,int val)
{
if(node[k].l==node[k].r) return node[k].l;
if(val>node[node[k].son[0]].cnt)return query(node[k].son[1],val-node[node[k].son[0]].cnt);
else query(node[k].son[0],val);
}
int main()
{
std::ios::sync_with_stdio(false);
node[1].l=1; node[1].r=1e9+7;
int n,sth;
cin>>n;
ans=0;
for(int i=1;i<=n;++i)
{
cin>>sth;
modify(1,sth);
}
int m;
cout<<"Please input the number:";
cin>>m;
int v;
for(int i=1;i<=n;++i)
{
cin>>v;
cout<<"The "<<v<<"th max number is: ";
cout<<query(1,v)<<endl;
}
}

总结

其实这个东西可以支持边增加数,边查询第n小,这样总比,加一个数sort一遍要快太多了。然后当你自己已经能够熟练地敲这篇代码的时候,我相信你也很快也可以理解到主席树的精髓!!!

主席树铺垫——总区间第k小的更多相关文章

  1. ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解

    题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...

  2. HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. 主席树(可持久化线段树)静态区间第K小

    传送门主席树 #include <bits/stdc++.h> #define int long long using namespace std; const int maxn=2e5+ ...

  4. SPOJ COT Count on a tree(树上主席树 + LCA 求点第k小)题解

    题意:n个点的树,每个点有权值,问你u~v路径第k小的点的权值是? 思路: 树上主席树就是每个点建一棵权值线段树,具体看JQ博客,LCA用倍增logn求出,具体原理看这里 树上主席树我每个点的存的是点 ...

  5. HDU 2665(主席树,无修改第k小)

    Kth number                                                 Time Limit: 15000/5000 MS (Java/Others)   ...

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

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

  7. 主席树 - 查询某区间第 K 大

    You are working for Macrohard company in data structures department. After failing your previous tas ...

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

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

  9. 主席树入门——询问区间第k大pos2104,询问区间<=k的元素个数hdu4417

    poj2104找了个板子..,但是各种IO还可以进行优化 /* 找区间[l,r]第k大的数 */ #include<iostream> #include<cstring> #i ...

随机推荐

  1. 2.WebPack初始化

    一.Package.json 在项目中输入: npm init 之后会提示你一步一步输入信息,我输入的信息如下: 生成的Package.json文件如下 我们也可以在初始时省略这些步骤,让脚本使用默认 ...

  2. JavaScript 集合基本操作

    参考 MDN 集合 Array 1. 2种创建数组的方式 var fruits = [] ; var friuits = new Array(); 2. 遍历 fruits.forEach(funct ...

  3. 33_栈程序演示.swf

    pBottom执行栈底有效元素的前一个节点,该节点没有存储有效数据,这样设计是便于栈的管理,向链表一样pHead指向链表的第一个节点,该节点是不存储有效数据的 pTop执行栈顶最新的节点 如果pTop ...

  4. 4、struct2的支持团队开发

    在一个大型的项目中,不同的人都开发不同的模块,不能所有的人都去操作同一个struct.xml文件,我们应该对于不同的模块对应不同的配置文件 列如我们对应的登陆模块,我们可以编写一个登陆的配置文件 1. ...

  5. 02【熟悉】springboot和微服务的介绍

    1,springboot简介 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程. 该框架使用了特定的方式来进行配置,从 ...

  6. Redis五种数据类型应用场景

    目录 1.1 回顾 2.1 应用场景 2.1.1 String 2.1.2 Hash 2.1.3 List 2.1.4 Zet 2.1.5 zset 3.1 小结 1.1 回顾 Redis的五种数据类 ...

  7. pikachu靶场-XSS

    .Tips: 一般查询接口容易出现反射型XSS,留言板容易出现存储型XSS 由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效,或者环境限制了执行(浏览器): 通过变化不同的scr ...

  8. 使用docker创建rocketMQ容器

    一.rocketMQ安装 (一)安装NameSrv 1.创建nameSrv数据挂载文件夹 mkdir -p /usr/data/rocketMQ/data/namesrv/logs mkdir -p ...

  9. swaager-ui 美化版

    简介 Swagger UI允许任何人(无论您是开发团队还是用户)都可以可视化API资源并与之交互,而无需任何实现逻辑.它是根据您的OpenAPI(以前称为Swagger)规范自动生成的,具有可视化文档 ...

  10. 状压DP之集合选数

    题目 [HNOI2012]集合选数 <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不 ...