我好像发现了一种全新的数据结构
  • 板块灌水区
  • 楼主AstaSunch_
  • 当前回复14
  • 已保存回复14
  • 发布时间2025/1/19 17:18
  • 上次更新2025/1/19 20:04:14
查看原帖
我好像发现了一种全新的数据结构
764773
AstaSunch_楼主2025/1/19 17:18

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);
}
2025/1/19 17:18
加载中...