划分树求第K大数
来源:互联网 发布:acg和sia知乎 编辑:程序博客网 时间:2024/06/16 10:56
输入//1 5 4 8 7 3(第三大)输出//5#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int ans; #define N 100005int a[N], as[N];int n, m;int sum[20][N];int tree[20][N];void build(int c, int l, int r){ int i, mid = (l + r) >> 1, lm = mid - l + 1, lp = l, rp = mid + 1; for (i = l; i <= mid; i++){ if (as[i] < as[mid]){ lm--; } } for (i = l; i <= r; i++){ if (i == l){ sum[c][i] = 0; }else{ sum[c][i] = sum[c][i - 1]; } if (tree[c][i] == as[mid]){ if (lm){ lm--; sum[c][i]++; tree[c + 1][lp++] = tree[c][i]; }else tree[c + 1][rp++] = tree[c][i]; } else if (tree[c][i] < as[mid]){ sum[c][i]++; tree[c + 1][lp++] = tree[c][i]; } else{ tree[c + 1][rp++] = tree[c][i]; } } if (l == r)return; build(c + 1, l, mid); build(c + 1, mid + 1, r);}int query(int c, int l, int r, int ql, int qr, int k){ int s; int ss; int mid = (l + r) >> 1; if (l == r){ ans=tree[c][l]; return ans; } if (l == ql){ s = 0; ss = sum[c][qr]; }else{ s = sum[c][ql - 1]; ss = sum[c][qr] - s; } if (k <= ss){ return query(c + 1, l, mid, l + s, l + s + ss - 1, k); }else{ return query(c + 1, mid + 1, r, mid - l + 1 + ql - s, mid - l + 1 + qr - s - ss,k - ss); }}int main(){ int i, j, k,T; scanf("%d",&T); while(T--){ scanf("%d%d", &n, &m); for (i = 1; i <= n; i++){ scanf("%d", &a[i]); tree[0][i] = as[i] = a[i]; } sort(as + 1, as + 1 + n); build(0, 1, n); while(m--){ scanf("%d%d%d",&i,&j,&k);query(0, 1, n, i, j, k); printf("%d\n", ans); }} return 0; }
0 0
- 划分树求第k大数
- 划分树求第K大数
- 【划分树】求区间K大数
- pku2104 第k大数-划分树做法
- poj 2104 划分树(查询区间第k大数)
- POJ2104 K-th Number 划分树求区间第K大数
- POJ2104-K-th Number-求区间第K大数(暴力or归并树or划分树)
- POJ 2104 K-th Number(区间第k大数)(平方分割,归并树,划分树)
- 小白算法练习 POJ 2104 K-th 区间K大数 划分树
- hdu2852(线段树求第k大数)
- 快排划分思想的应用-求第k大数或者第k小的数(求前k大数或者前k小的数)
- k 大数
- 区间第K大数——划分树(POJ2104解题报告)
- 划分树学习小记 Poj 2104+Poj 2761+Hdu 2665 (区间第k大数)
- poj2104 求区间第k大数(划分&&主席--待补)
- hdu 2852 KiKi's K-Number 线段树求第k大数
- 数组中求第K大数
- 求第k大数
- hdu1671
- LeNet-5手写数字识别——可训练参数的求解详解
- 基本的Xml文件读取工具类(通用)
- startup.bat详解
- javascript中的innerHTML是什么意思,怎么个用法?
- 划分树求第K大数
- JAVA EE---Servlet 学习第四天
- E - 叠筐
- C++基础 (二)有关于类
- iOS视频下载成功block回调
- VFW(video for window)技术-- 监控
- Linux操作系统
- mybatis和hibernate的区别
- HDU 2896 病毒侵袭