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 object 转为 json

    JSONObject jsonObject=JSONObject.fromObject(map) 执行到这的时候没有任何反应的原因及解决办法 http://blog.csdn.net/tjcyjd/a ...

  2. JAVA中的数据存储(堆及堆栈)- 转载

    1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可 ...

  3. JavaWeb -- Struts2,对比, 简单表单提交,校验,防重复提交, 文件上传

    Struts2核心流程图 1. Struts2 和 Struts1 对比 struts1:基于Servlet(ActionServlet),actionForm众多(类的爆炸),action单例(数据 ...

  4. Find Min In Rotated Sorted Array,寻找反转序列中最小的元素。

    问题描述:寻找反转序列中最小的元素. 算法分析:和寻找某个数是一个道理,还是利用二分查找,总体上分两种情况.nums[left]<=nums[mid],else.但是,在截取子序列的时候,有可能 ...

  5. 10 个深恶痛绝的 Java 异常

    异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题. 今天,来列一下 Java 中经常遇到的前 10 个异常,排名 ...

  6. 教你打造一个Android组件化开发框架

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 CC:Component Caller,一个android组件化开发框架, 已开源,github地址:https://github ...

  7. Go-gin CORS 跨域中间件

    原文:https://stackoverflow.com/questions/29418478/go-gin-framework-cors func CORSMiddleware() gin.Hand ...

  8. 跨平台TTS eSpeak Windows开发

    转摘请说明出处:http://www.cnblogs.com/luochengor/p/3511165.html以及作者,谢谢. eSpeak是最为流行的开源跨平台的文本转语音程序.这两天进行了简单的 ...

  9. ARM汇编指令集4

    协处理器cp15操作指令: mcr & mrc •mrc用于读取CP15中的寄存器 •mcr用于写入CP15中的寄存器   什么是协处理器? •SoC内部另一处理核心,协助主CPU实现某些功能 ...

  10. struts中操作request,session

    在Action类中操作request,session 方法一.利用ActionContext.getContext().get("request"); //返回的是Map集合 Ma ...