静态区间第k大(分桶法和平方分割)
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大(分桶法和平方分割)的更多相关文章
- poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 43315 Accepted: 14296 Ca ...
- HDU3473--Minimum Sum(静态区间第k大)
Minimum Sum Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- 静态区间第k大(归并树)
POJ 2104为例 思想: 利用归并排序的思想: 建树过程和归并排序类似,每个数列都是子树序列的合并与排序. 查询过程,如果所查询区间完全包含在当前区间中,则直接返回当前区间内小于所求数的元素个数, ...
- 主席树(静态区间第k大)
前言 如果要求一些数中的第k大值,怎么做? 可以先就这些数离散化,用线段树记录每个数字出现了多少次. ... 那么考虑用类似的方法来求静态区间第k大. 原理 假设现在要有一些数 我们可以对于每个数都建 ...
- 可持久化线段树(主席树)——静态区间第k大
主席树基本操作:静态区间第k大 #include<bits/stdc++.h> using namespace std; typedef long long LL; ,MAXN=2e5+, ...
- 数据结构2 静态区间第K大/第K小
给定数组$A[1...N]$, 区间$[L,R]$中第$K$大/小的数的指将$A[L...R]$中的数从大到小/从小到大排序后的第$K$个. "静态"指的是不带修改. 这个问题有多 ...
- 主席树初步学习笔记(可持久化数组?静态区间第k大?)
我接触 OI也快1年了,然而只写了3篇博客...(而且还是从DP跳到了主席树),不知道我这个机房吊车尾什么时候才能摸到大佬们的脚后跟orz... 前言:主席树这个东西,可以说是一种非常畸形的数据结构( ...
- 主席树学习笔记(静态区间第k大)
题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输出 ...
- POJ2104-- K-th Number(主席树静态区间第k大)
[转载]一篇还算可以的文章,关于可持久化线段树http://finaltheory.info/?p=249 无修改的区间第K大 我们先考虑简化的问题:我们要询问整个区间内的第K大.这样我们对值域建线段 ...
随机推荐
- Windowsforms 中对文件操作
文件及文件夹操作: 引用命名空间:using system .IO; 1.File类: 创建:File.Create(路径);——返回FileStream FileStream fs = File.C ...
- 关于C# DropDownList 动态加载数据笔记
今天在处理一个导游注册的页面,其中需要填写地址以及该地址下所有旅行社,地址区级以上都是用下拉列表实现,具体地址街道等手动填写.在填写区县之后,该区县下的所有旅行社也需要动态加载. 后台代码 DataT ...
- 【数据分析 R语言实战】学习笔记 第四章 数据的图形描述
4.1 R绘图概述 以下两个函数,可以分别展示二维,三维图形的示例: >demo(graphics) >demo(persp) R提供了多种绘图相关的命令,可分成三类: 高级绘图命令:在图 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 下一篇:Farseer.net轻量级ORM开源框 ...
- Vue 路由知识二(工程模式下路由的配置)
vue-router是一个插件包,所以我们还是需要用npm/cnpm来进行安装的:npm/cnpm install vue-router --save-dev. 在路由的核心文件:src/router ...
- Swift3命名空间的实现
最近在看一些Swift开源库的时候,发现了一些优秀的开源库都使用了命名空间,例如Kingfisher这个开源库中,就针对UIImage,UIImageView,UIButton做了命名空间的扩展.通过 ...
- Python游戏开发入门
Pygame简介与安装 1.Pygame安装 pip install pygame2.检测pygame是否安装成功 python -m pygame.examples.aliens Pygame最小开 ...
- CSS3 自动旋转
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【转】MFC 自定义edit 限制输入十六进制内容 响应复制粘贴全选剪切的功能
参考地址:MFC 自定义edit 限制输入内容 响应复制粘贴全选剪切的功能 Ctrl组合键ASCII码 ^Z代表Ctrl+z ASCII值 控制字符 AS ...
- vue工程化之去除Eslint验证
有的时候用vue-cli创建好项目之后,写代码时会出现换行和空格报错,出现这么写错误是什么原因呢? 相信第一次接触时有点摸不着头脑.其实是在你用vue-cli脚手架构建项目时用了ESLint代码检查工 ...