2019-06-02
题目: 洛谷 P1168 中位数 :
题目描述
给出一个长度为NNN的非负整数序列AiA_iAi,对于所有1≤k≤(N+1)/21 ≤ k ≤ (N + 1) / 21≤k≤(N+1)/2,输出A1,A3,…,A2k−1A_1, A_3, …, A_{2k - 1}A1,A3,…,A2k−1的中位数。即前1,3,5,…1,3,5,…1,3,5,…个数的中位数。
输入输出格式
输入格式:第111行为一个正整数NNN,表示了序列长度。
第222行包含NNN个非负整数Ai(Ai≤109)A_i (A_i ≤ 10^9)Ai(Ai≤109)。
输出格式:共(N+1)/2(N + 1) / 2(N+1)/2行,第iii行为A1,A3,…,A2k−1A_1, A_3, …, A_{2k - 1}A1,A3,…,A2k−1的中位数。
输入输出样例
7 1 3 5 7 9 11 6
1 3 5 6
说明
对于20%20\%20%的数据,N≤100N ≤ 100N≤100;
对于40%40\%40%的数据,N≤3000N ≤ 3000N≤3000;
对于100%100\%100%的数据,N≤100000N ≤ 100000N≤100000。
思想:
每次输入保证输入有序,若为基数,输出中间值。
方法:
使用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]<<' '; 22 } 23 } 24 return 0; 25 } 26 //
注意事项:
inster添加元素时,添加在提供迭代器的前方。
upper_bound()严格大于,参数左闭右开。
vector下标从0开始。