http://pat.zju.edu.cn/contests/pat-a-practise/1057

题目的意思是可以在一个可以任意添加于删除整数的集合里随时查找该集合的中位数

每次查找用nlogn的方法显然会超时

所以要一种方法接近0(N)的查找方法,  ( 计算第k大的数会超时!!)

比如当前有1,4,7

则树状数组的sum结果会是 1,1,1,2,2,2,3

现在就变成了二分查找(3+1)/2 ,即2的最左端的位置

ps: 2分查找有两种形式 (有一种会出错)

int find(int value)// 1,2,3
{
int mid,ll=,rr=;
while(ll<=rr)
{
mid=(ll+rr)/;
if(value<=s[mid])rr=mid-;
else ll=mid+;
}
return ll;
}

这种查找1,2,3都不会出错

int find(int value)//1,2,3
{
int mid,ll=,rr=;
while(ll<rr-)
{
mid=(ll+rr)/;
if(value<=s[mid])rr=mid;
else ll=mid;
}
return rr;
}

这种查找1是会出错!!!

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stack>
using namespace std; int n=;
int tree[];
int add[];
int size=; int lowbit(int x)
{
return x&(-x);
} void updata(int x,int c)
{
int i;
for(i=x;i<=n;i+=lowbit(i))
{
tree[i]+=c;
}
} int getsum(int x)
{
int i;
int temp=;
for(i=x;i>=;i-=lowbit(i))
{
temp+=tree[i];
}
return temp;
} int find()
{
int ll=,rr=,mid=(ll+rr)/; int sum;
while(ll<=rr){
mid=(ll+rr)/;
sum=getsum(mid);
if(sum< ((size+)/)) ll=mid+;
else if(sum> ((size+)/)) rr=mid-;
else if(sum == ((size+)/)) rr=mid-;
}
return ll;
} int main()
{
int t;
scanf("%d",&t);
int i,temp;
char ss[];
stack<int>sta;
for(i=;i<=n;i++){
tree[i]=;
add[i]=;
} for(i=;i<=t;i++){
scanf("%s",ss);
if(ss[]=='p'){
if(size==){
printf("Invalid\n");
}else{
printf("%d\n",sta.top());
updata(sta.top(),-);
add[sta.top()]--;
sta.pop();
size--;
}
} if(ss[]=='s'){
scanf("%d",&temp);
add[temp]++;
sta.push(temp);
updata(temp,);
size++;
} if(ss[]=='e'){
if(size==){
printf("Invalid\n");
}else{
printf("%d\n",find());
}
}
} return ;
}

随时查找中位数——pat1057的更多相关文章

  1. 求中位数,O(n)的java实现【利用快速排序折半查找中位数】

    查找无序数组的中位数,要想时间复杂度为O(n)其实用计数排序就能很方便地实现,在此讨论使用快速排序进行定位的方法. 1.中位数定义 2.算法思想 3.Java代码实现 4.时间复杂度分析 5.附录 中 ...

  2. LeetCode 4 Median of Two Sorted Arrays 查找中位数,排除法,问题拓展 难度:1

    思路:设现在可用区间在nums1是[s1,t1),nums2:[s2,t2) 1.当一个数组可用区间为0的时候,由于另一个数组是已经排过序的,所以直接可得 当要取的是最小值或最大值时,也直接可得 2. ...

  3. Google 面试题:Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java

    Google面试题 股市上一个股票的价格从开市开始是不停的变化的,需要开发一个系统,给定一个股票,它能实时显示从开市到当前时间的这个股票的价格的中位数(中值). SOLUTION 1: 1.维持两个h ...

  4. 题目1004:Median(查找中位数)

    问题来源 http://ac.jobdu.com/problem.php?pid=1004 问题描述 给你两个非降序序列,让你求中位数.中位数为第(n+1)/2个数(从0开始计算). 问题分析 这个问 ...

  5. 可以随时查找的max栈和max队列——面试

    这是面试中比较常见的题目,max队列也是编程之美里的一道题 对于max的栈,有个比较简单的办法就是,每次入栈前判断栈顶元素与正在入栈的元素哪个大,哪个大就哪个入栈 对于队列,我们知道可以用两个栈来实现 ...

  6. 查找第K小的元素(利用中位数线性时间选择)(C)

    找任意第k个小的元素 #include <stdio.h> #include <stdlib.h> #include <ctime> #include <io ...

  7. 在一个文件中有10G个整数,乱序排列,要求找出中位数

     题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). ...

  8. 腾讯面试题:10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。

    腾讯面试题:10G 个整数,乱序排列,要求找出中位数.内存限制为 2G. 题目和基本思路都来源网上,本人加以整理. 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只 ...

  9. 10G整数,找出中位数

    摘自: http://www.cnblogs.com/avril/archive/2012/04/20/2460805.html http://blog.csdn.net/flyinghearts/a ...

随机推荐

  1. TED字幕摘抄

    1.丹·吉尔伯特: 我们为什么快乐?http://v.163.com/movie/2012/12/0/S/M8HHB6LDT_M8HHCBM0S.html 在两百万年中, 大脑脑容量从我们祖先能人的1 ...

  2. java中的char类型所占空间

    java中统一使用unicode编码,所以每个字符都是2个字节16位.unicode包括中文,所以对String类计算长度的时候,一个中文和一个英文都是一个长度.String voice = &quo ...

  3. yii2:引用项目外的文件或类

    yii2:引用项目外的文件或类 以项目:frontend为例,文件目录如下: frontend/    frontend/controllers    frontend/views    fronte ...

  4. 【转】安装Ubuntu时卡在logo界面

    Ubuntu15.04 安装卡在logo界面不动,进度点卡死不动,原因主要是双显卡,电源设置项默认不合理,导致安装失败. 选择USB硬盘(uefi),进入到一个有四个选项的界面,分别是 1,try U ...

  5. RedHat Linux服务器安全配置细节

    1.概述 Linux服务器版本:RedHat Linux AS 2.1 对于开放式的操作系统---Linux,系统的安全设定包括系统服务最小化.限制远程存取.隐藏重要资料.修补安全漏洞.采用安全工具以 ...

  6. saltstack技术入门与实践

    基本原理 SaltStack 采用`C/S`模式,server端就是salt的master,client端就是minion,minion与master之间通过`ZeroMQ`消息队列通信. minio ...

  7. iRed邮箱使用情况

    iRedAdmin-Pro 在域名的用户列表里直接显示了邮箱使用情况的百分比,并有一个细小的进度条以不同颜色标示百分比情况.用户的邮箱限额定义在 mailbox.quota,当前使用情况定义在 use ...

  8. 【Java】对象的创建过程

    一.对象的创建过程 1.首次创建对象时或该类静态方法/静态域首次被访问时,JAVA解释器查找该类的路径,定位该类的class文件 2.载入该类的class文件,有关静态初始化的所有动作执行,但是只执行 ...

  9. laravel中Blade模板继承

    Blade模板继承 和 区块 <!-- 文件保存于 resources/views/layouts/app.blade.php --> <html> <head> ...

  10. Solr集群安装

    1.JDK安装版本:jdk1.8.0 安装原文件路径:10.58.111.35(10.58.111.36.10.58.111.44)堡垒机 [/opt/jdk-8u101-linux-x64.tar. ...