POJ 2104为例

思想:

《挑战程序设计竞赛》中介绍的方法。

分桶法:把一排物品或者平面分成桶,每个桶分别维护自己内部的信息,已达到高效计算的目的。

设一共有n个数,每b个分到一个桶里,并对桶内元素进行排序。给定区间,求小于x的数的个数

  • 对于完全包含在区间内的桶,直接二分查找满足条件的个数,每个桶处理需要O(logb)的时间。
  • 剩余的不完全分布在其他桶的数,逐个查找,每个元素处理需要O(1)的时间。
  • 可以看出,应该使桶的个数比桶内元素个数略少一些。

如果b=n−−√,那么这就叫平方分割,查找过程时间复杂度为O(n−−√logn),如果b=nlogn−−−−−√,那么复杂度为O(nlogn−−−−−√),加上最外面的二分,整体时间复杂度为O(nlogn+mn−−√log1.5n)。

代码:

#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 1e5+5, b = 1200;
int a[maxn], num[maxn];//[)
vector<int>v[maxn/b];
int main (void)
{
int n, m;scanf("%d%d",&n,&m);
//int b = floor(sqrt(n));
for(int i = 0; i < n; i++){
scanf("%d",&a[i]);
v[i/b].push_back(a[i]);
num[i] = a[i];
}
sort(num, num + n);
for(int i = 0; i <= n/b; i++)
sort(v[i].begin(), v[i].end());
int l, r, mid;
int lo, ro, k, tl, tr;
while(m--){
scanf("%d%d%d",&tl,&tr,&k);
int l = 0, r = n;
while(l < r - 1){
int c = 0;
mid = l + (r - l)/2;
lo = tl -1, ro = tr;
while(lo<ro && lo%b != 0) if(a[lo++] < num[mid]) c++;
while(lo<ro && ro%b != 0 )if(a[--ro] < num[mid]) c++;
for(int i = lo/b; i < ro/b; i++)
c +=lower_bound(v[i].begin(), v[i].end(), num[mid]) - v[i].begin();
if(c <= k-1) l = mid;
else r = mid;
}
printf("%d\n",num[l]);
}
return 0;
}//11000ms

分桶法思想get了,可是这个跑的也真的是有点慢。。。

静态区间第k大(分桶法和平方分割)的更多相关文章

  1. poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 43315   Accepted: 14296 Ca ...

  2. HDU3473--Minimum Sum(静态区间第k大)

    Minimum Sum Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  3. 静态区间第k大(归并树)

    POJ 2104为例 思想: 利用归并排序的思想: 建树过程和归并排序类似,每个数列都是子树序列的合并与排序. 查询过程,如果所查询区间完全包含在当前区间中,则直接返回当前区间内小于所求数的元素个数, ...

  4. 主席树(静态区间第k大)

    前言 如果要求一些数中的第k大值,怎么做? 可以先就这些数离散化,用线段树记录每个数字出现了多少次. ... 那么考虑用类似的方法来求静态区间第k大. 原理 假设现在要有一些数 我们可以对于每个数都建 ...

  5. 可持久化线段树(主席树)——静态区间第k大

    主席树基本操作:静态区间第k大 #include<bits/stdc++.h> using namespace std; typedef long long LL; ,MAXN=2e5+, ...

  6. 数据结构2 静态区间第K大/第K小

    给定数组$A[1...N]$, 区间$[L,R]$中第$K$大/小的数的指将$A[L...R]$中的数从大到小/从小到大排序后的第$K$个. "静态"指的是不带修改. 这个问题有多 ...

  7. 主席树初步学习笔记(可持久化数组?静态区间第k大?)

    我接触 OI也快1年了,然而只写了3篇博客...(而且还是从DP跳到了主席树),不知道我这个机房吊车尾什么时候才能摸到大佬们的脚后跟orz... 前言:主席树这个东西,可以说是一种非常畸形的数据结构( ...

  8. 主席树学习笔记(静态区间第k大)

    题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输出 ...

  9. POJ2104-- K-th Number(主席树静态区间第k大)

    [转载]一篇还算可以的文章,关于可持久化线段树http://finaltheory.info/?p=249 无修改的区间第K大 我们先考虑简化的问题:我们要询问整个区间内的第K大.这样我们对值域建线段 ...

随机推荐

  1. Farseer.net轻量级开源框架 中级篇:UrlRewriter 地址重写

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: Cookies.Session.Request 下一篇:Farseer.net轻量 ...

  2. vue热重载

    依据官网使用 webpack 的 Hot Module Replacement API,Vuex 支持在开发过程中热重载 mutation.module.action 和 getter.你也可以在 B ...

  3. css 样式渲染

     1.文字过长时,自动换行

  4. json 存 window.localStorage.setItem('hideColums',hideArr);

    onColumnSwitch:function(row, $element){ //JSON.parse() var showColumns=$('#table').bootstrapTable('g ...

  5. asp 读取 另外一个带参数的asp文件(服务器不支持!放弃吧!骚年!)

    (服务器不支持!放弃吧!骚年!) 主要作用是为了分离数据库,灵感是这样的:收到json影响,把asp里的数据,用一个页面输出,然后用另外一个页面读取,这样就不用有数据库位置的烦恼了 代码 网上有很多, ...

  6. 输入一个字符串输出ASCII的十六进制值

    #include <stdio.h> #include <string.h> #define LEN 1024 void main() { char s[LEN] = &quo ...

  7. 2. 区分散列的 undef 值, 和手动赋值 0 不一样。1. 使用exists函数,散列中有这个键(必须是keys %hash 有这结果),则返回真值,

    2. 123 my %vertical_alignment;    124 $vertical_alignment{"subscripting"} = 0;    125 unle ...

  8. Python --- 二叉树的层序建立与三种遍历

    二叉树(Binary Tree)时数据结构中一个非常重要的结构,其具有....(此处省略好多字)....等的优良特点. 之前在刷LeetCode的时候把有关树的题目全部跳过了,(ORZ:我这种连数据结 ...

  9. React初步学习-利用React构建个人博客

    React初步学习-利用React构建个人博客 用React和Webpack写了一个很简单的个人博客,主要是想要熟悉一下react中各种基本基本属性及方法的使用.在构建过程中碰到不少问题,通过阅读官方 ...

  10. PHP 处理接口保证数据安全性

    原地址:http://blog.csdn.net/lhbeggar/article/details/46377653 php做APP接口时,如何保证接口的安全性? 1.当用户登录APP时,使用http ...