POJ 2104K-th Number 划分树
来源:互联网 发布:海盗船水冷控制软件 编辑:程序博客网 时间:2024/05/22 04:24
题目:http://poj.org/problem?id=2104
题意:给定一个数组,求给定区间内的第k大值
思路:划分树模板题
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 100100;int n, m;int arr[N], arrs[N];int cut[20][N], seg[20][N];struct node{ int l, r;}s[N*4];void build(int d, int l, int r, int k){ s[k].l = l, s[k].r = r; if(l == r) return; int mid = (l + r) >> 1, cnt = mid - l + 1, lb = l, rb = mid + 1; for(int i = l; i <= mid; i++) /*初始假设左半部分值都等于中间值,然后计算真正等于中间值的个数*/ if(arrs[i] < arrs[mid]) cnt--; for(int i = l; i <= r; i++) { if(i == l) cut[d][i] = 0; else cut[d][i] = cut[d][i-1]; if(seg[d][i] == arrs[mid]) { if(cnt) /*扔到左半部分*/ cnt--, cut[d][i]++, seg[d+1][lb++] = seg[d][i]; else seg[d+1][rb++] = seg[d][i]; /*扔到右半部分*/ } else if(seg[d][i] < arrs[mid]) cut[d][i]++, seg[d+1][lb++] = seg[d][i]; else seg[d+1][rb++] = seg[d][i]; } build(d + 1, l, mid, k << 1); build(d + 1, mid + 1, r, k << 1|1);}int query(int d, int l, int r, int k, int x){ if(s[k].l == s[k].r) return seg[d][s[k].l]; int ls, lss, mid = (s[k].l + s[k].r) >> 1; if(s[k].l == l) ls = 0, lss = cut[d][r]; else ls = cut[d][l-1], lss = cut[d][r] - ls; if(x <= lss) return query(d + 1, s[k].l + ls, s[k].l + ls + lss - 1, k << 1, x); else return query(d + 1, mid + 1 + l - s[k].l - ls, mid + 1 + r - s[k].l - ls - lss, k << 1|1, x - lss);}int main(){ int a, b, c; while(~ scanf("%d%d", &n, &m)) { for(int i = 1; i <= n; i++) { scanf("%d", &arr[i]); seg[0][i] = arrs[i] = arr[i]; } sort(arrs + 1, arrs + 1 + n); build(0, 1, n, 1); while(m--) { scanf("%d%d%d", &a, &b, &c); printf("%d\n", query(0, a, b, 1, c)); } } return 0;}
0 0
- POJ 2104 K-th Number 划分树
- poj 2104 K-th Number--划分树
- poj 2104 K-th Number(划分树)
- POJ 2104 K-th Number 划分树
- [POJ 2104] K-th Number [划分树]
- poj 2104 K-th Number(划分树)
- POJ 2104 K-th Number 划分树
- POJ 2104 K-th Number 划分树
- K-th Number - POJ 2104 划分树
- POJ 2104 K-th Number【划分树】
- POJ 2104 K-th Number (划分树)
- POJ 2104K-th Number 划分树
- poj 2104K-th Number(划分树)
- POJ 2104 K-th Number 划分树
- poj 2104 K-th Number(划分树)
- POJ 2104 K-th Number 归并树与划分树
- poj 2104 K-th Number(划分树 or 主席树)
- POJ 2104 K-th Number (主席树 || 划分树)
- 有关抑郁
- <<Effective C++>>读书笔记5: 实现
- iOS --统一导航栏“返回”键,并当push隐藏控制器底部tabBar
- 【HYSBZ1588: [HNOI2002]】营业额统计——伸展树
- Windows驱动开发(8) - 派遣函数
- POJ 2104K-th Number 划分树
- Android开发中如何让你的TextView有跑马灯效果?
- js 插件的写法
- 互联网秒杀业务架构设计 / 秒杀系统架构分析与实战
- LoadRunner下设置监控Windows系统资源
- Swift开发入门:按钮(UIButton)空间
- Android环境搭建
- 飛飛(四十三)复数类中的运算符重载(用友元函数编写)
- TP-LINK WR740N V5.7刷OpenWrt的一些经验