洛谷 P1168 中位数

2019-06-02

题目: 洛谷 P1168 中位数 :


题目描述

给出一个长度为NNN的非负整数序列AiA_iAi,对于所有1≤k≤(N+1)/21 ≤ k ≤ (N + 1) / 21k(N+1)/2,输出A1,A3,…,A2k−1A_1, A_3, …, A_{2k - 1}A1,A3,,A2k1的中位数。即前1,3,5,…1,3,5,…1,3,5,…个数的中位数。

输入输出格式

输入格式:

111行为一个正整数NNN,表示了序列长度。

222行包含NNN个非负整数Ai(Ai≤109)A_i (A_i ≤ 10^9)Ai(Ai109)。

输出格式:

(N+1)/2(N + 1) / 2(N+1)/2行,第iii行为A1,A3,…,A2k−1A_1, A_3, …, A_{2k - 1}A1,A3,,A2k1的中位数。

输入输出样例

输入样例#1:
7
1 3 5 7 9 11 6
输出样例#1:
1
3
5
6

说明

对于20%20\%20%的数据,N≤100N ≤ 100N100;

对于40%40\%40%的数据,N≤3000N ≤ 3000N3000;

对于100%100\%100%的数据,N≤100000N ≤ 100000N100000。


思想:

每次输入保证输入有序,若为基数,输出中间值。

方法:

使用std::vector<Type> $,使用std::upper_bound(std::$.begin(),std::$.end(),Value),使用std::$.inster(std::vector<Type>::iterator,Value)

说明:

定义std::vector<Type> $储存信息

使用std::upper_bound(std::$.begin(),std::$.end(),Value)找到第一个严格大于Value的值所在的迭代器

使用std::$.inster(std::vector<Type>::iterator,Value)在迭代器std::vector<Type>::iterator前添加一个元素值为Value

令新添加的数b一定有a<=b<c,所以找到第一个严格大于它的元素的迭代器,并在其前面添加该元素

vector下标从0开始,所以奇数的中位数下标一定是[n/2]

AC代码:

 

 1 //
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 typedef unsigned long long ll;
 5 #define ri register ll
 6 
 7 ll n;
 8 vector<ll> q;
 9 
10 signed main()
11 {
12     ios::sync_with_stdio(0),cin.tie(0);
13     cin>>n;
14     for(ri i=1;i<=n;i++)
15     {
16         ri k;
17         cin>>k;
18         q.insert(upper_bound(q.begin(),q.end(),k),k);
19         if(i%2==1)
20         {
21             cout<<q[i/2]<<'\n';
22         }
23     }
24     return 0;
25 }
26 //

注意事项:

inster添加元素时,添加在提供迭代器的前方。

upper_bound()严格大于,参数左闭右开。

vector下标从0开始。

 

 

 

 

 

 

posted @ 2019-06-02 00:29  敲可耐的螺旋藻  阅读(124)  评论(0编辑  收藏  举报