prority_queue
不可以输出下标,只能手写
代码
题目:n个操作,三个格式 insert x /pop / query x
,插入x,删除堆里最大值,输出x的下标(若不存在输出-1)
// 优先队列 - 最大堆
// data 存放数据 范围 -1e9~1e9
// size 表示堆里面数据的个数
// 记录下标版本 可以直接输出数据的下标
// 前提 没有数值重复
namespace maxHeap {
int data[N];// 最大堆的数据
int size = 0;// 最大堆的个数
map<int, int> mp;// mp<值,下标>
//堆里插入数据
void insert(int x) {
int i = ++size;
for (; data[i / 2] < x; i /= 2) {
data[i] = data[i / 2];
mp[data[i]] = i; //记录当前数字的下标
}
data[i] = x;
mp[data[i]] = i;
}
//删除堆顶
void pop() {
if (size == 0) return;
int top = data[1];
mp[top] = -1;
int x = data[size];
size--;
if (size == 0) { //当堆里只有一个数据 pop后 就不允许继续下去 同时修改data[1]
data[1] = -INF;
return;
}
int p, c;//父亲节点 儿子节点
for (p = 1; p * 2 <= size; p = c) {
c = p * 2;
if ((c != size) && (data[c] < data[c + 1])) {
c++;
}
if (x >= data[c]) break;
else {
data[p] = data[c];
data[c] = -INF;
mp[data[p]] = p;
}
}
data[p] = x;
mp[data[p]] = p;
}
//输出堆内所有的值
void out() {
for (int i = 1; i <= size; i++) {
cout << data[i] << ' ';
}
cout << endl;
}
//最大堆初始化
void init() {
string s;//操作符号
int x;//值
memset(data, -INF, sizeof data);
data[0] = INF;
cin >> n;//输入n个操作
while (n--) {
cin >> s;
if (s == "insert") {
cin >> x;
insert(x);
} else if (s == "pop") {
pop();
} else { //查询值为x的下标
cin >> x;
if (mp.count(x))
cout << mp[x] << endl;
else //如果堆里没有这个值 输出-1
cout << -1 << endl;
}
//out();
}
}
}
using namespace maxHeap;