求调fhq玄关
  • 板块灌水区
  • 楼主ChenZQ
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/23 17:33
  • 上次更新2024/11/23 17:34:58
查看原帖
求调fhq玄关
745358
ChenZQ楼主2024/11/23 17:33
有一个队列,队列里的每一个元素都是由(标号,优先级) 构成的

多组输入,每行输入一个op
如果op为1,要求插入一个数,格式为{编号,优先级}

如果op为2,输出优先级最大的元素并删除

如果op为3,输出优先级最小的元素并删除

如果op为0,结束

现在没法提交,要求不恶搞能调过样例就行

输入


2
1 20 14
1 30 3
2
1 10 99
3
2
2
0
输出
0
20
30
10
#include <bits/stdc++.h>
using namespace std;

const int N = 200010;
struct node
{
	int l,r,c,p,rd,sz;
};
node fhq[N];
int tot=0,rt=0;

void upd(int x)
{
	fhq[x].sz=fhq[fhq[x].l].sz+fhq[fhq[x].r].sz+1;
}
void split(int rt,int x,int y,int p)
{
	if(rt==0)
	{
		x=0,y=0;return;
	}
	if(fhq[rt].c<=p)
	{
		x=rt;split(fhq[rt].r,fhq[x].r,y,p);
	}
	else
	{
		y=rt;split(fhq[rt].l,x,fhq[y].l,p);
	}
	upd(rt);
} 
int merge(int x,int y)
{
	if(x==0 || y==0) return x+y;
	if(fhq[x].rd>fhq[y].rd)
	{
		fhq[x].r=merge(fhq[x].r,y);
		upd(x);
		return x;
	}
	else
	{
		fhq[y].l=merge(x,fhq[y].l);
		upd(y);
		return y;
	}
}
void insert(int k,int p)
{
	int x,y;
    split(rt,x,y,p);tot++;
	fhq[tot].c=p;fhq[tot].p=k;fhq[tot].rd=rand();fhq[tot].sz=1;
    int id=tot;
    
	rt=merge(merge(x,id),y);
}
int kth(int rt,int pai)
{
//	cout<<rt<<endl;
	if(fhq[fhq[rt].l].sz+1==pai) return fhq[rt].p;
	if(fhq[fhq[rt].l].sz>=pai) return kth(fhq[rt].l,pai);
	else return kth(fhq[rt].r,pai-(fhq[fhq[rt].l].sz+1));
}
int kkth(int rt,int pai)
{
	if(fhq[fhq[rt].l].sz+1==pai) return fhq[rt].c;
	if(fhq[fhq[rt].l].sz>=pai) return kkth(fhq[rt].l,pai);
	else return kkth(fhq[rt].r,pai-(fhq[fhq[rt].l].sz+1));
}
void del(int v)
{
	int x,y,id;
	split(rt,x,y,v);
	split(x,x,id,v-1);
	rt=merge(x,y);
}
int main()
{
	int op;
	while(scanf("%d",&op)==1)
	{
        int k,p;
        //cout<<rt<<"asdf"<<endl;
		if(op==0) break;
		if(op==1)
		{
			scanf("%d%d",&k,&p);
			insert(k,p);
		}
		else if(op==2)
		{
			if(fhq[rt].sz==0)
			{
				puts("0");
				continue;
			}
			printf("%d\n",kth(rt,1));
			del(kkth(rt,1));
		}
		else
		{
			if(fhq[rt].sz==0)
			{
				puts("0");
				continue;
			}
			printf("%d\n",kth(rt,fhq[rt].sz));
			del(kkth(rt,fhq[rt].sz));
		}
	}
}
/* 
2
1 20 14
1 30 3
2
1 10 99
3
2
2
0
*/
2024/11/23 17:33
加载中...