Loading...

洛谷P1168 中位数

check评论:0 条 remove_red_eye浏览量:365 change_historyTags:编程学习笔记
作者 : deco date_range日期 : 2018-08-15

$vector$轻松水过

或成此题最短代码?

首先介绍一下$STL$容器$vector$

$vector$基本操作:

$vc.push\_back()$在$vector$末尾插入一个数据

$vc.insert()$在$vecter$中插入一个元素

$vc.erase()$在$vector$中删除一个元素

$vc.at()$在$vector$中获取某个元素($vc[a]$等价于$vc.at(i)$)

因为每次插入后排序时间代价太大,则插入采用$lower\_bound$来二分大于等于该数的数的指针,使得每次插入完都是已经排好序的,均摊插入时间复杂度$O(\sqrt n)$

然后每次插入后,直接输出当前容器内第$\frac{size()-1}{2}$项即可($vector$是从第$0$项开始存储的)

好了,上代码

#include <bits/stdc++.h>
using namespace std;
int n;
vector<int>a;
int main()
{
    cin>>n;
    for(int i=1,x;i<=n;i++)
    {
        scanf("%d",&x);
        a.insert(upper_bound(a.begin(),a.end(),x),x);//二分插入保证单调性
        if(i%2==1)
        {
            printf("%d\n",a[(i-1)/2]);//是奇数个就输出
        }
    }
    return 0;
}

洛谷P1531 I hate it chevron_right

暂无评论

正在回复给  
去登陆?

   点击刷新验证码

标签云

文章留名