基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题
 
一个长度为N的整数序列,编号0 - N - 1。进行Q次查询,查询编号i至j的所有数中,第K大的数是多少。
例如: 1 7 6 3 1。i = 1, j = 3,k = 2,对应的数为7 6 3,第2大的数为6。
 
Input
第1行:1个数N,表示序列的长度。(2 <= N <= 50000)
第2 - N + 1行:每行1个数,对应序列中的元素。(0 <= S[i] <= 10^9)
第N + 2行:1个数Q,表示查询的数量。(2 <= Q <= 50000)
第N + 3 - N + Q + 2行:每行3个数,对应查询的起始编号i和结束编号j,以及k。(0 <= i <= j <= N - 1,1 <= k <= j - i + 1)
Output
共Q行,对应每一个查询区间中第K大的数。
Input示例
5
1
7
6
3
1
3
0 1 1
1 3 2
3 4 2
Output示例
7
6
1 思路:
可持久化线段树入门题。离散化处理下就好了
其实可持久化线段树跟之前写过的线段树动态开点是差不多的,都是为了维护状态,需要开很多棵线段树来维护。
可持久化线段树维护的是每一次修改后的状态。比如这道题我们就可以利用他的能够查询历史版本的特性来解决 ps:之前有点错误,改正了一遍 实现代码:
#include<bits/stdc++.h>
using namespace std;
const int M = 2e6+;
int idx; //记录目前一共建过多少节点
int sum[M],ls[M],rs[M]; //区间和,左儿子,右儿子
int rt[M]; //每次修改对应的根节点编号
int a[M],ans[M],lst[M],cnt,num[M],n,m; struct node{
int id,l,r,x;
bool operator < (const node &b) const {
return r < b.r;
}
}q[M]; void build(int &k,int l,int r){
//k传的是地址,这样在一层函数中修改k就可以直接修改上一层的lson和rson了
k = ++idx; //为新节点标号
if(l == r) return ; //一定要在创建新节点之后再return
int m = (l + r) >> ;
build(ls[k],l,m);
build(rs[k],m+,r);
} void change(int old,int &k,int l,int r,int p,int x){
k = ++idx; //修改的时候要创建新点
ls[k] = ls[old]; rs[k] = rs[old];
sum[k] = sum[old] + x; //先把原来节点的信息复制过来,顺便修改区间和
if(l == r) return ; //先建点后return
int m = (l + r) >> ;
if(p <= m) change(ls[old],ls[k],l,m,p,x);
else change(rs[old],rs[k],m+,r,p,x);
} int query(int k,int old,int l,int r,int x){
if(l == r) return l;
int m = (l + r) >> ;
int ret = sum[rs[k]] - sum[rs[old]];
if(ret >= x)
return query(rs[k],rs[old],m+,r,x);
else
return query(ls[k],ls[old],l,m,x-ret);
} int find(int x){
return lower_bound(num+,num + cnt + , x) - num;
} int main()
{
ios::sync_with_stdio();
cin.tie(); cout.tie();
cin>>n;
for(int i = ;i <= n;i ++){
cin>>lst[i];a[i] = lst[i];
}
sort(lst+,lst+n+);
for(int i = ;i <= n;i ++){
if(i == ||lst[i] != lst[i-])
num[++cnt] = lst[i];
}
build(rt[],,cnt);
cin>>m;
for(int i = ;i <= m;i ++){
q[i].id = i;
cin>>q[i].l; q[i].l ++;
cin>>q[i].r; q[i].r ++;
cin>>q[i].x;
}
sort(q+,q+m+);
for(int i = ,j = ;i <= n;i ++){
change(rt[i-],rt[i],,cnt,find(a[i]),);
while(q[j].r == i){
ans[q[j].id] = query(rt[i],rt[q[j].l-],,cnt,q[j].x);
j++;
}
}
for(int i = ;i <= m;i ++){
printf("%d\n",num[ans[i]]);
}
return ;
}

51Nod 1175 区间中第K大的数 (可持久化线段树+离散)的更多相关文章

  1. 51nod p1175 区间中第K大的数

    1175 区间中第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有 ...

  2. 51nod1175 区间中第K大的数

    裸的主席树. #include<cstdio> #include<cstring> #include<cctype> #include<algorithm&g ...

  3. 51nod 区间中第K大的数

    区间中第K大的数 基准时间限制:1 秒 空间限制:131072 KB  一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,第K大的数是多少. 例如: 1 7 6 ...

  4. 动态求区间K大值(权值线段树)

    我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和 ...

  5. bzoj4504 k个串 kstring 可持久化线段树 (标记永久化)

    [fjwc2015]k个串 kstring [题目描述] 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只 ...

  6. 【XSY2720】区间第k小 整体二分 可持久化线段树

    题目描述 给你你个序列,每次求区间第\(k\)小的数. 本题中,如果一个数在询问区间中出现了超过\(w\)次,那么就把这个数视为\(n\). 强制在线. \(n\leq 100000,a_i<n ...

  7. 可持久化线段树(主席树)(图文并茂详解)【poj2104】【区间第k大】

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63740442 向大(hei)佬(e)实力学(di ...

  8. 51NOD 1105 第K大的数

    数组A和数组B,里面都有n个整数. 数组C共有n^2个整数,分别是: A[0] * B[0],A[0] * B[1] ...... A[0] * B[n-1] A[1] * B[0],A[1] * B ...

  9. AC日记——第K大的数 51nod 1105

    1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * ...

随机推荐

  1. vmware共享文件夹

    环境: VMware Workstation 11.0 虚拟机中的系统:Ubuntu 16.04 物理机:window 7 安装好vmware tools后在 /mnt/hgfs 里没有东西,是空白的 ...

  2. MariaDB数据库性能优化

    1. 硬件优化 1.1 内存(Memory) 内存是最重要的因素,因为它允许您调整服务器系统变量.更多的内存意味着可以将更大的密钥和表缓存存储在内存中,从而减少磁盘访问速度,降低一个数量级. 如果未将 ...

  3. 一、CnPack源码模板功能快速添加注释

    Delphi通过CnPack源码模板功能,能快速添加注释,非常之好用,使用方法如下图: 1.选择CnPack的源码模板专家 2.设置Pacal标准过程头 3.设置内容如下,并且设置了Ctrl+W的快捷 ...

  4. win10触摸板手势

    尴尬的发现,今天才开始使用win10的手势,之前都是单指操作/笑哭 参考:http://www.sohu.com/a/63678223_230077 https://support.microsoft ...

  5. vue 使用 proxyTable 解决跨域问题

    1.在 main.js 中,在引入 axios: import axios from 'axios' Vue.config.productionTip = false Vue.prototype.$a ...

  6. 牛客练习赛44 B题 (思维)

    链接:https://ac.nowcoder.com/acm/contest/634/B 来源:牛客网 给出n条线段,第i条线段的长度为ai, 每次可以从第i条线段的j位置跳到第i + 1条线段的j+ ...

  7. 汇编 浮点指令FLD,FSTP,FADD与FPU寄存器

    知识点:  浮点数的存放方式  st0至st7  FLD,FST,FADD指令 一.浮点数的存放方式 00401000 /$ 55 PUSH EBP 00401001 |. 8BEC MOV E ...

  8. P2463 [SDOI2008]Sandy的卡片

    写一种\(O(nm)\)的做法,也就是\(O(\sum 串长)\)的. 先通过差分转化,把每个数变成这个数与上一个数的差,第一个数去掉,答案就是最长公共子串+1 按照套路把所有串拼起来,中间加一个分隔 ...

  9. Salesforce随笔: 解决被指定给Chatter相关用户的RecordType无法被删除的问题

    被指定给以下三组用户的RecordType无法在对应的Profile里取消占用: Chatter External User Chatter Free User Chatter Moderator U ...

  10. 记录:将图片数据生成 tfrecords 文件并在训练使用时读取

    直接用别人的就行了: https://github.com/myCVs/GenTFRecords