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