题意:

给定一个序列,求[a,b]区间第k大的数字。

思路:

主席树模板题,但是注意数据范围,需要离散化。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>#define w(i) T[(i)].w
#define ls(i) T[(i)].ls
#define rs(i) T[(i)].rs
using namespace std;
const int MAXNN=100005;struct NUM
{int a,rank;
}num[MAXNN];int cmp(NUM a,NUM b)
{return a.a<b.a;
}struct node
{int ls,rs,w;node(){ls=rs=w=0;}
} T[MAXNN*20];
int root[MAXNN],sz,m;
int a[MAXNN];void ins(int &i,int l,int r,int x)
{T[++sz]=T[i];i=sz;w(i)++;if (l==r) return;int m=(l+r)>>1;if (x<=m) ins(ls(i),l,m,x);else ins(rs(i),m+1,r,x);
}
int query(int i,int j,int l,int r,int k)
{if (l==r) return l;int t=w(ls(j))-w(ls(i));int m=(l+r)>>1;if (t>=k) return query(ls(i),ls(j),l,m,k);else return query(rs(i),rs(j),m+1,r,k-t);
}
int aa[MAXNN];
int bb[MAXNN];
int main()
{//DO YOLOint n,m;while(scanf("%d%d",&n,&m)!=EOF){root[0]=0;sz=0;memset(num,0,sizeof(num));for (int i=1; i<=n; i++){scanf("%d",&num[i].a);num[i].rank=i;bb[i] = aa[i] = num[i].a;}sort(num+1,num+1+n,cmp);sort(bb+1, bb+1+n);memset(a,0,sizeof(a));for(int i=1;i<=n;i++)a[num[i].rank]=i;for(int i=1;i<=n;i++){root[i]=root[i-1];//int pos = lower_bound(bb+1, bb+1+n, aa[i]) - bb;ins(root[i],1,n, a[i]);}for(int i=1; i<=m; i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);//int pos = query(root[a-1], root[b], 1, n, c);//printf("%d\n", bb[pos]);int ans=query(root[a-1],root[b],1,n,c);printf("%d\n",num[ans].a);}//QUERY(s,t,k):query(root[s-1],root[T],1,n,k);}return 0;
}

poj2104(区间第k大+离散化)相关推荐

  1. Dynamic Rankings——带修改区间第k大

    三种做法: 1.整体二分: 二分mid 考虑小于mid的修改的影响 但是大于mid的修改可能会干掉小于mid的一些值 所以额外把一个修改变成一个值的删除和一个值的添加 这样就相互独立了! 整体二分,树 ...

  2. POJ 2104 K-th Number 主席树(区间第k大)

    题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...

  3. hdu 5919--Sequence II(主席树--求区间不同数个数+区间第k大)

    题目链接 Problem Description Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2 ...

  4. J - [永不止步-2017]_区间第K大-线段树维护

    J - [永不止步-2017]_区间第K大 把线段树的结点的数据域设置为vector类型即可别的操作为区间更新模板 思路就是这样runtime error暂时没改对 #include<bits/ ...

  5. O(n)复杂度求区间第K大

    O(n)复杂度求区间第K大 描述 给你一个数组,O(N)复杂度找出其中第K大的数. 输入 第一行包括两个数,N,K,分别代表数组大小,以及你应该找出第K大的数. 接下来N行,每行包括一个数. ​ 输出 ...

  6. P2617 Dynamic Rankings 动态区间第K大【树套树】或【整体二分】

    传送门 动态区间第KKK大问题,单点修改(这里是第kkk小,即是从小到大第kkk个) 这里还有个区间修改,有点类似的 P3332 [ZJOI2013]K大数查询 分析 树套树 树套树,就是用一种树形结 ...

  7. 区间第K大(划分树)

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1175 注意一个很明显的结论:求区间[p,q]的第K大就等于求区间[ ...

  8. HDU2665(函数式线段树-区间第K大)

    题目:K-th Number 如果求区间第K小,就转换一下就行了,假设你要求区间[u,v]的第k小,那就是第v-u+1-k大 #include<stdio.h> #include<a ...

  9. CSU - 2078 查找第k大(O(n)区间第k大 快排思想)

    题目 T组数据,每次给出n(n<=1e7)个正整数, 输出从大到小第k大的数,时限1s,空间131072KB 题解 现在想想找第k大就是快排划个轴递归嘛,像线段树上二分一样 nth_elemen ...

最新文章

  1. 在Win10下解压linux压缩包,Win10如何解压缩文件?win10使用命令行来解压缩文件的方法...
  2. 2017-2018-2 20179202《网络攻防技术》第一周作业
  3. 安装Ubuntu之后一定要安装Docky
  4. android开发入门与实践_我的新书《Android App开发入门与实战》已经出版
  5. 【POJ2386】Lake Counting
  6. 软件工程中需要学习和掌握的软件都有哪些_上海理工大学869软件工程考研经验...
  7. Voxengo音频插件合集:Voxengo Total Bundle Mac
  8. 渗透测试常用工具-amap服务枚举
  9. Gym - 101177K Kiwis vs Kangaroos 水题手动打表
  10. Anaconda3 安装失败 failed to create menus
  11. 文明6/Civilization VI 全DLC解锁
  12. Mezzanine 修改默认主页
  13. 1024,一封写给CSDN家园Python初学者的信 Python初级、中级、高级学习路线
  14. Android电视直播 v5.6,龙龙直播app下载|龙龙直播apk2019官方版下载 v5.6.1 安卓版 - 数码资源网...
  15. A - ASCII码排序
  16. CodeWarrior下载及安装
  17. SPI思想应用之拔插式插件
  18. 交换机链路聚合在网络中的作用
  19. 国仁老猫:怎么制作抖音100W播放量的作品;首选需要精准定位。
  20. mybatis-plus的${ew.sqlSegment},${ew.sqlSelect},${ew.sqlSet},${ew.customSqlSegment}使用与区别

热门文章

  1. 科大星云诗社动态20210324
  2. [云炬python3玩转机器学习笔记] 3-4创建Numpy数组和矩阵
  3. 吴恩达《优化深度神经网络》精炼笔记(1)-- 深度学习的实用层面
  4. lollipods耳机蓝牙连接方法
  5. c语言vs开发小型数据库,用C语言开发小型数据库管理系统代码
  6. python怎样导入excel数据_python导入excel数据
  7. 基于暗通道优先算法的去雾应用Matlab
  8. uint8、double、mat2uint、imhist绘直方图w恩替藐视
  9. VirtualBox使用技巧
  10. 从内存中加载并启动一个exe