`
Simone_chou
  • 浏览: 192741 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

Median(Multiset )

    博客分类:
  • ZOJ
 
阅读更多
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. 

 

        题意:

        给出 T(0 ~ 100) 组 case,后给出 N(0 ~ 10000) 个操作,有两类操作 “remove” 代表在数列中移除某个数,“add” 代表往数列中添加某个数。每次操作后都输出一个结果,如果删除不存在的数则输出 Wrong!,如果删除后数列为空则输出 Empty!,除此之外都输出这个数列中的中间值。

 

        思路:

        STL 中 multiset 的灵活运用,将这个数列分成两半,插入的时候判断第一个数组尾和第二个数组头大小插入,删除时候分别查找两个数组即可。

        Multiset 中的元素由小到大自动排列,数列中的数可以重复,而 Set 不可以。

        m.erase(a)代表将数组中所有的 a 值删除,m.erase( m.find(a))代表只删除其中一个 a 值,还有 m.end()返回的是数组最末位的下一个位置,要判断最后一个元素的值应该把指针前移一个再做取数的操作。注意这些大概就没有什么问题了。还有数记得要开 long long。

 

        AC:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
#include <cstdlib>

using namespace std;

typedef long long ll;

multiset<ll> m1;
multiset<ll> m2;

void init() {
        m1.clear();
        m2.clear();
}

void Printf() {
        if (m1.empty() && m2.empty())
                puts("Empty!");
        else if (m1.size() == m2.size()) {
                multiset<ll>::iterator it = m1.end();
                --it;

                ll res = *it + *m2.begin();
                if (res < 0) {
                        printf("-");
                        res *= -1;
                }
                if (!(res % 2)) printf("%lld\n", res / 2);
                else printf("%lld.5\n", res / 2);
        } else printf("%lld\n", *m2.begin());
}

void Remove (ll ans) {

        if (m1.find(ans) == m1.end() &&
            m2.find(ans) == m2.end()) {
                puts("Wrong!");
                return;
        } else if (m1.find(ans) != m1.end()) {
                m1.erase( m1.find(ans) );
                if (m2.size() - m1.size() == 2) {
                        ll t = *m2.begin();
                        m1.insert(t);
                        m2.erase( m2.find(t) );
                }
        } else {
                m2.erase( m2.find(ans) );
                if (m1.size() - m2.size() == 1) {
                        multiset<ll>::iterator it = m1.end();
                        --it;

                        ll t = *it;
                        m2.insert(t);
                        m1.erase( m1.find(t) );
                }
        }

        Printf();
}

void Add (ll ans) {

        if (m1.empty() && m2.empty()) {
                m2.insert(ans);
        } else if (m1.empty() && !m2.empty()) {
                if (ans > *m2.begin()) {
                        m1.insert( *m2.begin() );
                        m2.erase(  m2.find(*m2.begin())  );
                        m2.insert(ans);
                } else m1.insert(ans);
        } else if (ans >= *m2.begin()){
                m2.insert(ans);
                if (m2.size() - m1.size() == 2) {
                        ll t = *m2.begin();
                        m2.erase( m2.find(t) );
                        m1.insert(t);
                }
        } else {

                m1.insert(ans);
                if (m1.size() - m2.size() == 1) {
                        multiset<ll>::iterator it = m1.end();
                        --it;

                        ll t = *it;
                        m1.erase( m1.find(t) );
                        m2.insert(t);
                }
        }

        Printf();
}

int main() {
        //freopen("test.in", "r", stdin);

        int t;
        scanf("%d", &t);

        while (t--) {
                ll n, ans;
                char ord[10];

                init();

                scanf("%lld", &n);

                while (n--) {
                        scanf("%s%lld", ord, &ans);
                        if (!strcmp(ord, "remove"))
                            Remove(ans);
                        else Add(ans);
                }

        }

        return 0;
}

 

 

分享到:
评论

相关推荐

    MedianFlow.rar

    **MedianFlow追踪算法详解** MedianFlow是一种经典的运动目标追踪算法,由Matthias Kaltenbach在2009年提出。这个算法的核心是基于中值流的概念,它结合了光流法和卡尔曼滤波器的优点,适用于处理复杂的背景、光照...

    Median-filtering.rar_median filter

    标题"Median-filtering.rar_median filter"提到了"中值滤波"这一关键词,这是一项在图像处理领域广泛应用的技术。"Median filter"通常是指中值滤波器,它是一种非线性的滤波方法,主要用于去除图像中的噪声,尤其是...

    K-Median_聚类_

    "K-Median_聚类_" 指的是使用K-Median算法进行聚类的过程。K-Median是K-Means算法的一种变体,主要区别在于它使用中位数而非平均值来代表每个簇的中心,这使得它对异常值更具鲁棒性。 K-Median算法的基本步骤如下:...

    3x3_Median_test.zip_3X3_median vhdl_median3x3_vhdl median

    【3x3_Median_test.zip_3X3_median vhdl_median3x3_vhdl median】这个标题揭示了我们要讨论的核心内容:一个3x3中值滤波器的VHDL实现。VHDL(Very High Speed Integrated Circuit Hardware Description Language)是...

    ada.rar_Adaptive median_Median Algorithm_median

    标题中的“ada.rar_Adaptive median_Median Algorithm_median”暗示了我们正在探讨一种名为“自适应中值滤波器”的算法,通常用于图像处理领域。在图像处理中,中值滤波器是一种非线性的滤波方法,它通过将图像窗口...

    Median - MetaTrader 5脚本.zip

    **MetaTrader 5脚本——Median** MetaTrader 5(MT5)是一个广泛使用的交易平台,专为金融市场的交易者设计,支持多种金融工具,包括外汇、股票、期货等。它提供了丰富的技术分析工具和自动化交易功能,使得交易者...

    Select-Median.rar_median select_medianselect_select median

    在给定的标题“Select-Median.rar_median select_medianselect_select median”和描述“存在拍好序的数组x[n]、y[n].输出2n个数的中位数,要求时间为O(lgn)”中,我们关注的是如何高效地找到两个已排序数组x[n]和y[n...

    K-Median_聚类r.rar

    《K-Median与K-Medoids聚类算法详解及其在智能学习中的应用》 在机器学习和数据分析领域,聚类是一种无监督学习方法,用于发现数据集中的内在结构和模式,而无需预先知道数据的类别标签。K-Median和K-Medoids是两种...

    median_polish.zip_median

    "median_polish.zip_median"文件包就提供了一个这样的解决方案,它基于Tukey的中位数平滑法(Median Polish),这是一种用于拟合加性模型的稳健方法。 Tukey的中位数平滑法,也称为中位数平滑或中位数打磨,是由...

    中值滤波median_filter

    中值滤波median_filtermedian_filtermedian_filtermedian_filtermedian_filter

    题目1004:Median

    Given an increasing sequence S of N integers, the median is the number at the middle position. For example, the median of S1={11, 12, 13, 14} is 12, and the median of S2={9, 10, 15, 16, 17} is 15. The...

    The gravity p-median model

    首先,“The gravity p-median model”这篇文章提出了一个新的P-中位问题模型,即重力P-中位模型。在标准P-中位问题中,通常假定每个需求点都由最近的设施服务。但在许多实际情况中,例如当需求点是顾客社区,并且每...

    017_影像平滑(medianBlur、bilateralFilter) _ 阿洲的程式教學1

    影像平滑(medianBlur、bilateralFilter) 影像平滑是图像处理中的一种重要技术,旨在去除图像中的噪音和杂讯,提高图像的质量和清晰度。常见的平滑方法有两种:线性滤波和非线性滤波。 线性滤波是指使用一个固定...

    九度1004Median

    ZJU考研机试真题 九度1004Median

    分治算法思想解决median问题

    Median问题,即求给定序列的中位数,是一个典型的应用分治策略的问题。中位数是将一个序列按照升序排列后位于中间位置的数,当序列长度为奇数时,中位数是唯一的;当序列长度为偶数时,中位数是中间两个数的平均值。...

    directional weighted median filter(DWMF)图像的方向加权中值滤波图像去噪matlab仿真

    1.领域:matlab,directional weighted median filter(DWMF)图像的方向加权中值滤波图像去噪 2.内容:directional weighted median filter(DWMF)图像的方向加权中值滤波图像去噪matlab仿真+matlab操作视频 3.用处...

    a new directional weighted median filter

    标题"a new directional weighted median filter"提到了一种新的方向加权中值滤波器。在数字图像处理领域,滤波器是一种常用的技术,用于消除图像中的噪声或者进行图像增强。中值滤波器是其中的一种非线性滤波方法,...

    Adaptive-Median-Filter-master.zip

    本项目“Adaptive-Median-Filter-master.zip”提供了一个基于Matlab的解决方案,即使用自适应中值滤波器来去除椒盐噪声。 中值滤波器是图像处理中常用的一种非线性滤波方法,它的核心思想是用输入像素周围像素的...

    python 实现的median_cut算法

    按照多媒体课本上的步骤,严格执行中值区分算法,将24位图像转换为256色图

Global site tag (gtag.js) - Google Analytics