rt,双端优先队列,灵感来源于旁边同学(@yangzimu0131)写,梦熊 CSP-J 全真模拟赛 T3 的无厘头想法,可以同时支持查询和删除最大值和最小值,并让豆包帮忙实现了,代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef struct {
ll*data,sz,mx;
}pq;
void swap(ll*a,ll*b) {
ll temp=*a;
*a=*b,*b=temp;
}
pq* init(ll x) {
pq*Q=(pq*)malloc(sizeof(pq));
Q->mx=x,Q->sz=0,Q->data=(ll*)malloc(Q->mx*sizeof(ll));
return Q;
}
void nwupdmin(pq*Q,ll cur) {
ll p=(cur-1)/2;
if(cur>0&&Q->data[cur]<Q->data[p]) {
swap(&Q->data[cur],&Q->data[p]),nwupdmin(Q,p);
}
}
void delupdmin(pq*Q,ll cur) {
ll l=2*cur+1,r=2*cur+2,MIN=cur;
if(l<Q->sz&&Q->data[l]<Q->data[MIN])MIN=l;
if(r<Q->sz&&Q->data[r]<Q->data[MIN])MIN=r;
if(MIN!=cur)swap(&Q->data[cur],&Q->data[MIN]),delupdmin(Q,MIN);
}
void nwupdmax(pq*Q,ll cur) {
ll p=(cur-1)/2;
if(cur>0&&Q->data[cur]>Q->data[p])swap(&Q->data[cur],&Q->data[p]),nwupdmax(Q,p);
}
void delupdmax(pq*Q,ll cur) {
ll l=2*cur+1,r=2*cur+2,MAX=cur;
if(l<Q->sz&&Q->data[l]>Q->data[MAX])MAX=l;
if(r<Q->sz&&Q->data[r]>Q->data[MAX])MAX=r;
if(MAX!=cur)swap(&Q->data[cur],&Q->data[MAX]),delupdmax(Q,MAX);
}
void NEW(pq*Q,ll value) {
if(Q->sz==Q->mx)Q->mx*=2,Q->data=(ll*)realloc(Q->data,Q->mx*sizeof(ll));
Q->data[Q->sz]=value;
nwupdmin(Q,Q->sz),nwupdmax(Q,Q->sz),Q->sz++;
}
ll peekMin(pq*Q) {
if(Q->sz==0)return -1;
return Q->data[0];
}
ll removeMin(pq*Q) {
if(Q->sz==0)return -1;
ll min=Q->data[0];
Q->data[0]=Q->data[Q->sz-1],Q->sz--;
delupdmin(Q,0);
return min;
}
ll peekMax(pq*Q) {
if(Q->sz==0)return -1;
ll max=Q->data[0];
for (ll i=1;i<Q->sz;i++)
if(Q->data[i]>max)max=Q->data[i];
return max;
}
ll removeMax(pq*Q) {
if(Q->sz==0)return -1;
ll top=0;
for (ll i=1;i<Q->sz;i++)
if(Q->data[i]>Q->data[top])
top=i;
ll max=Q->data[top];
Q->data[top]=Q->data[Q->sz-1],Q->sz--;
delupdmax(Q,top);
return max;
}
ll empty(pq*Q) {
return Q->sz==0;
}
void clear(pq*Q) {
free(Q->data),free(Q);
}
int main() {
pq*Q=init(10);
NEW(Q,5);
NEW(Q,10);
NEW(Q,3);
NEW(Q,8);
NEW(Q,1);
cout<<peekMin(Q)<<endl;
cout<<peekMax(Q)<<endl;
removeMin(Q);
cout<<peekMin(Q)<<endl;
removeMax(Q);
cout<<peekMax(Q)<<endl;
clear(Q);
}