pku2761区间第k大数-二分+树状数组
来源:互联网 发布:大数据课程 编辑:程序博客网 时间:2024/06/05 14:28
http://poj.org/problem?id=2761
题意:给定一个数组,求一些区间的第k大数,数据比2104大10倍,开始没怎么看题,直接贴代码tle了。。。这题有一个很重要的限制,那就是不存在包含关系的区间。。。
分析:那个限制条件是关键。。。在那个限制条件下,我们能很自然的想到对查询排序,从从前往后扫,逐渐加点,删点。。。。剩下的工作就和xmu那题一样了。。。。
注意用树状数组需要先离散化。。。
代码:
#include<algorithm>#include<iostream>#include<map>using namespace std;const int N=100010;int sum[N], ans[N], c[N], n, m;//c存离散化后某个值对应的真值struct lisan{int i, ii, v; //ii为原来数组的序号,i为离散化后的值}b[N];struct node{int l, r, k, i;} a[N];int cmp2(const lisan &a, const lisan &b){return a.ii<b.ii;}int cmp1(const lisan &a, const lisan &b){return a.v<b.v;}int cmp(const node &a, const node &b){return a.l < b.l;}void update(int i, int v){for(; i<=n; i+=i&(-i))sum[i] += v;}int query(int i){int tmp=0;for(; i>0; i-=i&(-i))tmp += sum[i];return tmp;}int bs(int k){int l=1,r=n, mid, tmp;while(l<=r){mid = (l+r)>>1;tmp = query(mid);if(tmp>=k)r = mid-1;elsel = mid+1;}return c[l];}int main(){int i, j, ll, rr;while(scanf("%d%d", &n, &m)!=EOF){for(i=1; i<=n; i++){scanf("%d", &b[i].v);b[i].ii = i;}sort(b+1, b+n+1, cmp1);b[1].i = 1;c[1] = b[1].v;for(i=1, j=1; i<=n; i++){if(b[i].v!=b[i-1].v)b[i].i = ++j;elseb[i].i = j;c[j] = b[i].v;}sort(b+1, b+n+1, cmp2);for(i=1; i<=n; i++)sum[i] = 0;for(i=0; i<m; i++){scanf("%d%d%d",&a[i].l, &a[i].r, &a[i].k);a[i].i = i;}sort(a, a+m, cmp);ll = rr = 1;for(i=0; i<m; i++){while(rr<=a[i].r){update(b[rr].i, 1);rr++;}while(ll<a[i].l){update(b[ll].i, -1);ll++;}ans[a[i].i] = bs(a[i].k);}for(i=0; i<m; i++)printf("%d\n", ans[i]);}return 0;}
- pku2761区间第k大数-二分+树状数组
- 【整体二分+树状数组区间加区间和】BZOJ3110 [Zjoi2013]K大数查询
- 【BZOJ 3110】 [Zjoi2013]K大数查询 整体二分+树状数组区间修改
- ZOJ 3612 树状数组 第K大数
- [hdu 5592 ZYB's Premutation] 树状数组+二分 求第K大数
- 【51nod】 第K大区间2(二分+树状数组)
- [二分+树状数组]51 Nod 1685——第K大区间2
- BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)
- BZOJ 3110 [Zjoi2013]K大数查询 (整体二分 + 树状数组或线段树处理区间合值)
- 区间第K大数
- 区间第K大数
- bzoj3110 K大数查询 整体二分&树状数组
- poj 2104 K-th Number 区间第K大 二分 离散化 + (莫队 树状数组/平方分解/线段树)
- uva 11525 树状数组 求第k大数
- 第k大区间和问题的树状数组实现
- 【第k大区间和问题的树状数组实现】
- zoj2112 树状数组+主席树 区间动第k大
- 动态区间第K大(树状数组+主席树)
- VC2010 多文档选项卡模式的2个应用
- Twitter 将开源类Hadoop工具
- poj 2481 树状数组
- linux配置文件
- 在协调景城网市场部方面工作中遇到的一些问题问题
- pku2761区间第k大数-二分+树状数组
- 设计模式C++实现(4)——单例模式
- WinDBG教程
- php编程之对象篇
- C/C++ 标准输入输出重定向
- job hunting
- 浅析淘宝数据魔方技术架构
- Oracle String 合并与拆分
- create queue