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. mysql 一些属性

    1)定义id,设置int,涉及的属性有: BINARY二进制 UNSIGNED无符号数 UNSIGNED ZEROFILL 在列字段中使用UNSIGNED ZEROFILL属性,如: 插入int(4) ...

  2. jsp基础知识点——思维导图

    如图 思维导图图片链接 http://www.edrawsoft.cn/viewer/public/s/0b8cd083478732 有道云笔记图片链接 http://note.youdao.com/ ...

  3. Merge k Sorted Lists, k路归并

    import java.util.Arrays; import java.util.List; import java.util.PriorityQueue; /* class ListNode { ...

  4. Pandas级联

    Pandas提供了各种工具(功能),可以轻松地将Series,DataFrame和Panel对象组合在一起. pd.concat(objs,axis=0,join='outer',join_axes= ...

  5. Treflection04_面试题

    1. package reflectionZ; import java.lang.reflect.Field; import java.lang.reflect.Method; public clas ...

  6. flask学习(二):认识web

    url详解: URL是Uniform Resource Locator 的简写,统一资源定位符 一个URL由以下及几部分组成: scheme://host:port/path/?query-strin ...

  7. 解决:TypeError: object() takes no parameters

    运行测试用例时发现以下报错 Ran 1 test in 22.505s FAILED (errors=1) Error Traceback (most recent call last): File ...

  8. idea常用插件

    1.  装逼插件 1.1  activate-power-mode   其设置在菜单栏window——active-power-mode下设置颜色是否显示,窗口是否晃动等等 1.2  Backgrou ...

  9. Ceph Monitor的数据管理

    转自:https://www.ustack.com/blog/ceph-monitor-2/ Monitor管理了Ceph的状态信息,维护着Ceph中各个成员的关系,这些信息都是存放在leveldb中 ...

  10. socket http read

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...