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. Java JDBC概要总结一(基本操作和SQL注入问题)

    JDBC定义: JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API.JDBC是Java访问数据库的标准规范,可以为不同的关系 ...

  2. git branch管理小结

    神一样膜拜此链接下http://nvie.com/posts/a-successful-git-branching-model/对git branch模型管理,以下为我的学习心得: 一.branch动 ...

  3. 怎么用Python提取域名中的主域名

    从一个域名里面提取主域名,初想起来,貌似很简单,不就是数点[.]的个数吗?取最后一个点前后的字符串,那 abc.txt 是域名吗?那再加个验证,加上国家码,.com,.cn,.org结尾的才算,那这个 ...

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

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

  5. 【Hive】执行脚本

    1.linux下执行hive sql脚本 (1)hive -e “sql语句” (2)hive -e “sql语句” >> xxx 将sql查出来的语句重定向到xxx文件中,会显示Ok和数 ...

  6. python基础之socket编程(二)

    ssh远程执行命令: 思路分析: 客户端给服务端发送命令,服务端返回一个输出结果传给客户端. #coding:utf-8 #买手机 import socket import struct import ...

  7. LeetCode OJ:Excel Sheet Column Number(表格列数)

    Related to question Excel Sheet Column Title Given a column title as appear in an Excel sheet, retur ...

  8. springmvc用来绑定参数的注解(转)

    引言: 原文链接:http://blog.csdn.net/kobejayandy/article/details/12690161 接上一篇文章,对@RequestMapping进行地址映射讲解之后 ...

  9. canvas - 圆圈内 hover 高亮 效果

    各种计算还挺繁琐的, 关键点在角度的计算, 根据鼠标位置, 利用atan(y/x) 得到反正切值 , 角度  (tan输入的是r和x围成的那个角,输出的是y/x.反tan就是输入y/x输出角.) &l ...

  10. Visual Studio Nuget还原步骤

    vs2013是在这里还原: NuGet套件还原步骤(以vs2012为例) 下载别人的范例,出现由于Nuget套件不存在而无法启动时:效果如下图: 步骤如下:1.点击 项目->启用NuGet程序包 ...