Median(vector+二分)
Median
Time Limit: 5 Seconds Memory Limit: 65536 KB
The median of m numbers is after sorting them in order, the middle one number of them if m is even or the average number of the middle 2 numbers if m is odd. You have an empty number list at first. Then you can add or remove some number from the list.
For each add or remove operation, output the median of the number in the list please.
Input
This problem has several test cases. The first line of the input is an integer T (0<T<=100) indicates the number of test cases. The first line of each test case is an integer n (0<n<=10000) indicates the number of operations. Each of the next n lines is either "add x" or "remove x"(-231<=x<231) indicates the operation.
Output
For each operation of one test case: If the operation is add output the median after adding x in a single line. If the operation is remove and the number x is not in the list, output "Wrong!" in a single line. If the operation is remove and the number x is in the list, output the median after deleting x in a single line, however the list is empty output "Empty!".
Sample Input
2
7
remove 1
add 1
add 2
add 1
remove 1
remove 2
remove 1
3
add -2
remove -2
add -1
Sample Output
Wrong!
1
1.5
1
1.5
1
Empty!
-2
Empty!
-1
Hint
if the result is an integer DO NOT output decimal point. And if the result is a double number , DO NOT output trailing 0s.
题意:找中位数,由于数据比较大,用到了vector容器,
我也不会用,比赛前看过一点,可是不知道怎么用,so。。。比赛完,借大神的代码来观摩下,哈哈。我发现这个真的很好用。我一定要把他学会!!!
ps:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4736
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
vector<int>vet;
int deal(int x)
{
int left=,right=vet.size()-;
while(left<=right)
{
int mid=(left+right)/;
if(vet[mid]==x)
{
return mid;
}
else if(vet[mid]>x)
{
right=mid-;
}
else
{
left=mid+;
}
}
return -;
}
int erfen(int x)
{
if(vet.size()==) return ;
if(x<vet[]) return ;
if(x>vet[vet.size()-]) return vet.size();
int left=,right=vet.size()-,k=-;
while(left<=right)
{
int mid=(left+right)/;
if(vet[mid]>=x&&vet[mid-]<=x)
{
return mid;
}
else if(vet[mid]<=x&&vet[mid+]>=x)
{
return mid+;
}
else if(vet[mid]>x)
{
right=mid-;
}
else left=mid+;
}
}
int main()
{
int text;
scanf("%d",&text);
while(text--)
{
int n;
scanf("%d",&n);
vet.clear();
vector<int>::iterator it=vet.begin();
while(n--)
{ char ch[];
int x;
scanf("%s%d",ch,&x);
if(ch[]=='r')
{
if(vet.size()==)
{
printf("Wrong!\n");
continue;
}
else
{
int tmp=deal(x);
if(tmp==-)
{
printf("Wrong!\n");
continue;
}
else
{
it=vet.begin();
vet.erase((it+tmp));
int len=vet.size();
if(len==)
{
printf("Empty!\n");
continue;
}
else if(len%==)
cout<<vet[len/]<<endl;
else
{
long long ans=(long long)vet[len/]+(long long)vet[len/-];
if(ans%==)
printf("%lld\n",ans/);
else
{
double sum=ans/2.0;
printf("%.1lf\n",sum);
}
} }
}
}
else
{
int tmp=erfen(x);
it=vet.begin();
vet.insert((it+tmp),x);
int len=vet.size();
if(len%==)
printf("%d\n",vet[len/]);
else
{
long long ans=(long long)vet[len/]+(long long)vet[len/-];
if(ans%==)
printf("%lld\n",ans/);
else
{
double sum=ans/2.0;
printf("%.1lf\n",sum);
}
}
}
}
}
return ;
}
加油!!!加油!!!
Median(vector+二分)的更多相关文章
- 【POJ - 3579 】Median(二分)
Median Descriptions 给N数字, X1, X2, ... , XN,我们计算每对数字之间的差值:∣Xi - Xj∣ (1 ≤ i < j ≤N). 我们能得到 C(N,2) 个 ...
- BZOJ 2083: [Poi2010]Intelligence test [vector+二分]
2083: [Poi2010]Intelligence test Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 469 Solved: 227[Su ...
- POJ 3579 Median(二分答案)
Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11599 Accepted: 4112 Description G ...
- Gunner II--hdu5233(map&vector/二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5233 题意:有n颗树,第 i 棵树的高度为 h[i],树上有鸟,现在这个人要打m次枪,每次打的高度是 ...
- luogu P5826 【模板】子序列自动机 主席树 vector 二分
LINK:子序列自动机 想了一些很有趣的做法. dp 容易看出 f[i][j]表示前i个数匹配了j个数的dp 不过复杂度很高. 贪心 容易想到匹配的时候每个数字尽量往前匹配 这样显然是最优的 复杂度Q ...
- POJ 3579 Median(二分答案+Two pointers)
[题目链接] http://poj.org/problem?id=3579 [题目大意] 给出一个数列,求两两差值绝对值的中位数. [题解] 因为如果直接计算中位数的话,数量过于庞大,难以有效计算, ...
- POJ 3579 Median 【二分答案】
<题目链接> 题目大意: 给出 N个数,对于存有每两个数的差值的序列求中位数,如果这个序列长度为偶数个元素,就取中间偏小的作为中位数. 解题分析: 由于本题n达到了1e5,所以将这些数之间 ...
- HackerRank "Median Updates"
Same as LintCode "Sliding Window Median", but requires more care on details - no trailing ...
- 剑指offer 最小的k个数 、 leetcode 215. Kth Largest Element in an Array 、295. Find Median from Data Stream(剑指 数据流中位数)
注意multiset的一个bug: multiset带一个参数的erase函数原型有两种.一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数:另外 ...
随机推荐
- 存储过程 Mvc 的调用
/// <summary> /// 根据条件,使用存储过程分页查询电影 /// </summary> /// <param na ...
- 使用Flask+uwsgi+Nginx部署Flask正式环境
环境准备 在开始正式讲解之前,我们将首先进行环境准备. Step1:安装Python,pip以及nginx: sudo apt-get update sudo apt-get install pyth ...
- 《Python自动化运维之路》 系统基础信息模块(一)
系统性能收集模块Psutil 目录: 系统性能信息模块psutil 系统性能信息模块psutil psutil能够轻松实现获取系统运行的进程和系统利用率包括(CPU,内存,磁盘 和网络)等.主要用于系 ...
- [HEOI2016/TJOI2016]字符串(后缀数组+二分+主席树/后缀自动机+倍增+线段树合并)
后缀数组解法: 先二分最长前缀长度 \(len\),然后从 \(rnk[c]\) 向左右二分 \(l\) 和 \(r\) 使 \([l,r]\) 的 \(height\geq len\),然后在主席树 ...
- Spring boot中使用log4j
我们知道,Spring Boot中默认日志工具为logback,但是对于习惯了log4j的开发者,Spring Boot依然可以很好的支持,只是需要做一些小小的配置功能.Spring Boot使用lo ...
- Postgres 的 Array 类型
mysql 不支持 Array 类型 一.Postgres 原生SQL 适用场景:可以用于实现贴标签功能 1.定义 CREATE TABLE "Students" ( name V ...
- iOS-xcconfig环境变量那些事(配置环境的配置)
前言 在配置宏定义参数时,会发现一个问题,在需要临时修改或者测试一些数据时,修改宏,如果不修改,就多写一个,注释掉原来的,然后测试后,再换回来,当然了,如果一两个宏,可以这样,但是,如果每次改的比较多 ...
- _tkinter.TclError: image "pyimage1" doesn't exist 解决办法
_tkinter.TclError: image "pyimage1" doesn't exist 解决办法 1 def logout(self): 2 login.LoginWi ...
- swiper4-vue 不使用loop,由最后一张跳到第一张
<template> <div class="swiper-box"> <div class="swiper-container" ...
- C#基础篇八构造函数和面向对象思想
3.关于 对象创建的几个关键词 Dog d1 = new Dog(); Dog d1 叫做 声明变量 new Dog() 叫做 实例化(创建)对象 4.关于对象.方法和 this 的关系 Dog d1 ...