在做小学期Day5C题
步入正题
开始为空的一个数列
- 向数列中加入一个元素a
- 输入k
要求输出当前数列中第k大的数,
首先加上一个限制
现在去掉限制unoerdered_map
或gp_hash_table
给个这道题的AC代码
AC代码
#include <bits/stdc++.h>
#define maxn 200005
using namespace std;
map<int, int> num, arcnum;
int a[maxn], b[maxn], n;
int bit[maxn];
void add(int id, int x)
{
while(id < maxn)
{
bit[id] += x;
id += (id & -id);
}
}
int sum(int id)
{
int ret = 0;
while(id > 0)
{
ret += bit[id];
id -= (id & -id);
}
return ret;
}
int main()
{
ios::sync_with_stdio(false);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = a[i];
}
sort(b + 1, b + n + 1);
int cnt = 1;
for (int i = 1; i <= n; i++) {
num[b[i]] = cnt;
arcnum[cnt] = b[i];
cnt++;
}
for (int i = 1; i <= n; i++) {
add(num[a[i]], 1);
if((i & 1) == 0)
continue;
int l = 0, r = maxn, mid = 0;
while(l + 1 < r) {
mid = (l + r) >> 1;
if(sum(mid) < (i + 1) / 2) {//修改(i+1)/2即可询问第k大的数
l = mid;
} else {
r = mid;
}
}
cout << arcnum[r] << '\n';
}
return 0;
}