• 洛谷 P3871 [TJOI2010]中位数 解题报告


    P3871 [TJOI2010]中位数

    题目描述

    给定一个由N个元素组成的整数序列,现在有两种操作:

    1 add a

    在该序列的最后添加一个整数a,组成长度为N + 1的整数序列

    2 mid 输出当前序列的中位数

    中位数是指将一个序列按照从小到大排序后处在中间位置的数。(若序列长度为偶数,则指处在中间位置的两个数中较小的那个)

    例1:1 2 13 14 15 16 中位数为13

    例2:1 3 5 7 10 11 17 中位数为7

    例3:1 1 1 2 3 中位数为1

    输入输出格式

    输入格式:

    第一行为初始序列长度N。第二行为N个整数,表示整数序列,数字之间用空格分隔。第三行为操作数M,即要进行M次操作。下面为M行,每行输入格式如题意所述。

    输出格式:

    对于每个mid操作输出中位数的值


    当维护一个没有更改操作的序列的中位数时,我们可以用两个堆分别存储中位数左边和中位数右边的值来求解。


    #include <cstdio>
    #include <iostream>
    #include <queue>
    using namespace std;
    priority_queue <int > q1;//大根堆,放左边
    priority_queue <int,vector <int >,greater<int > > q2;//小跟堆,放右边
    int n,m,x;
    void add()
    {
        scanf("%d",&x);
        if(q2.size()<q1.size())
        {
            if(!q1.empty()&&x<q1.top())
            {
                q1.push(x);
                x=q1.top();
                q1.pop();
            }
            q2.push(x);
        }
        else
        {
            if(!q2.empty()&&x>q2.top())
            {
                q2.push(x);
                x=q2.top();
                q2.pop();
            }
            q1.push(x);
        }
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            add();
        scanf("%d",&m);
        string opt;
        for(int i=1;i<=m;i++)
        {
            cin>>opt;
            if(opt=="add")
                add();
            else
                printf("%d
    ",q1.top());
        }
        return 0;
    }
    
    

    2018.6.12

  • 相关阅读:
    flex布局以及相关属性
    css 选择器
    两侧定宽,中栏自适应布局
    两列定宽,一列自适应布局
    左列定宽,右列自适应布局
    Flex接收51单片机发送过来的16进制数据转换为String
    Flex与51单片机socket通信 策略问题
    sql For XML Path
    sql多对多探讨
    JavaScript
  • 原文地址:https://www.cnblogs.com/butterflydew/p/9175478.html
Copyright © 2020-2023  润新知