题意:给定一个数列,求一个区间的第K大数

模板题, 其中的newl, newr 有点不明白.

 #include <iostream>
#include <algorithm>
using namespace std;
const int M = ;
int toLeft[][M], tree[][M], sorted[M]; void build(int level, int left, int right)
{
if (left == right) return;
int i, mid = (left + right) >>;
int suppose = mid - left + ;
for (i=left; i<=right; i++)
if (tree[level][i] < sorted[mid])
suppose--;
int lpos = left, rpos = mid+;
for (i=left; i<=right; i++)
{
if (i == left)
toLeft[level][i] = ;
else
toLeft[level][i] = toLeft[level][i-];
if (tree[level][i] < sorted[mid])
{
toLeft[level][i]++;
tree[level+][lpos++] = tree[level][i];
}
else if (tree[level][i] > sorted[mid])
{
tree[level+][rpos++] = tree[level][i];
}
else
{
if (suppose != )
{
suppose--;
toLeft[level][i]++;
tree[level+][lpos++] = tree[level][i];
}
else
tree[level+][rpos++] = tree[level][i];
}
}
build(level+, left, mid);
build(level+, mid+, right);
} int query(int level, int left, int right, int qleft, int qright, int k)
{
if (qleft == qright)
return tree[level][qright];
int s, ss, mid = (left + right)>>;
if (left == qleft)
{
s = ;
ss = toLeft[level][qright];
}
else
{
s = toLeft[level][qleft-];
ss = toLeft[level][qright] - s;
}
int newl, newr;
if (k <= ss)
{
newl = left + s;
newr = left + s + ss -;
return query(level+, left, mid, newl, newr, k);
}
else
{
newl = mid-left++qleft-s;
newr = mid-left++qright-s-ss;
return query(level+, mid+, right, newl, newr, k-ss);
}
} int main()
{
int n, m;
int i;
while (scanf("%d%d", &n, &m) == )
{
for (i=; i<=n; i++)
{
scanf("%d", &tree[][i]);
sorted[i] = tree[][i];
}
sort(sorted+, sorted+n+);
build(,,n);
int ql, qr, k;
for (i=; i<m; i++)
{
scanf("%d%d%d", &ql, &qr, &k);
printf("%d\n", query(, , n, ql, qr, k));
}
}
return ;
}

最新文章

  1. PHP CURL模拟提交数据 攻击N次方
  2. 怎么把Windows主机上的目录共享到Ubuntu上
  3. tabbar的自定义
  4. set 赋值(转载)
  5. multipath 安装配置
  6. 原子/Atomic操作
  7. Python自动化运维之27、Django(一)
  8. linux网卡配置
  9. jdbc ,jdbcTemplate,MyBatis,Hibernate比较与分析
  10. Net分布式系统之五:微服务架构
  11. Bash 的若干基本问题
  12. HTML5 drag和drop的亲手实践
  13. GBK和UTF-8互相转码
  14. tp5上传图片添加永久素材到微信公众号
  15. ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇
  16. python 判断连个 Path 是否是相同的文件夹
  17. mysql navcate longblob 查询结果导出倒入
  18. [C++]栈区(栈)与堆区(类链表)[转/摘]
  19. linux space/mark设置
  20. centos 安装MySQL全过程

热门文章

  1. Black Box--[优先队列 、最大堆最小堆的应用]
  2. XP系统显示控件异常解决方法
  3. java 大数详细讲解
  4. OpenGL Geometry Shader
  5. 常用的高级sql查询
  6. [HNOI2010] 公交线路 bus
  7. JS实现购物车动态功能
  8. 利用Web服务生成产品编号 执行添加操作
  9. SQLachemy基础
  10. Centos 7.5源码编译安装zabbix4.0报fatal error: mysql.h: No such file or directory