POJ 2104 K-th Number 平方分割
来源:互联网 发布:宿州煤电集团知乎 编辑:程序博客网 时间:2024/05/21 08:35
题目:
http://poj.org/problem?id=2104
题意:
求区间[l,r]内第k小的元素
思路:
平方分割,效率很搓,但还是记录一下
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N = 100010, M = 500;vector<int> vec[N/M+1];int arr[N], brr[N];int n, m;int main(){ while(~ scanf("%d%d", &n, &m)) { for(int i = 1; i <= n; i++) { scanf("%d", &arr[i]); brr[i] = arr[i]; vec[i/M].push_back(arr[i]); } //此处与挑战稍有不同,最后一部分也要排序 for(int i = 0; i <= n/M; i++) sort(vec[i].begin(), vec[i].end()); sort(brr+1, brr+1+n); while(m--) { int a, b, k; scanf("%d%d%d", &a, &b, &k); int l = 1, r = n, res; while(l <= r) { int mid = (l + r) >> 1; int x = brr[mid]; int tl = a, tr = b, c = 0; while(tl <= tr && tl % M != 0) if(arr[tl++] <= x) c++; //注意是(tr+1) % M,使tr移动到某块的最后一个元素,假设最后一部分恰好是一个完整的桶,且tr是这个桶的最后一个,这时不对最后一部分排序就会出错,故上面要排序 while(tl <= tr && (tr+1) % M != 0) if(arr[tr--] <= x) c++; while(tl < tr) { int d = tl / M; c += upper_bound(vec[d].begin(), vec[d].end(), x) - vec[d].begin(); tl += M; } if(c >= k) res = mid, r = mid - 1; else l = mid + 1; } printf("%d\n", brr[res]); } for(int i = 0; i < N/M; i++) vec[i].clear(); } return 0;}
0 0
- POJ 2104 K-th Number 平方分割
- POJ 2104 K-th Number(区间第k大数)(平方分割,归并树,划分树)
- POJ 2104 K-th Number(快排 or 平方分割 or 归并树—求区间第k大数)
- poj 2104 K-th Number (分桶法和平方分割)
- POJ 2104 -- K-th Number (分桶法和平方分割)
- 平方分割poj2104K-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
- 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
- 流量监控工具iftop
- MySQL字符集专题(字符集,校对,乱码)
- String类型值不可变的原因
- HttpClient设置发送内容的编码格式
- jQuery 总体源码结构笔记
- POJ 2104 K-th Number 平方分割
- 安装和使用EPEL源linux安装包进行扩展
- 真正决定人生高度的,是你做事的速度
- mySql数据库备份与恢复
- 第十四周课后作业——项目一(4)
- [读书笔记]30 天自制操作系统 day6 分割编译与中断处理
- 20161206全志R16暂时没有发现只会ubuntu,全志H3可以支持UbuntuCore
- 1206
- Java多线程之Thread VS Runnable(根据慕课网视频编写)