社区讨论

堆模板P3386 30分求助

题目总版参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi7yl6n0
此快照首次捕获于
2025/11/21 05:44
4 个月前
此快照最后确认于
2025/11/21 05:44
4 个月前
查看原帖
2个代码全是30分,不知道为什么
CPP
#include <bits/stdc++.h>
using namespace std;
int T,h[900000],num=0; 
void pushdown(int x)
{
	int now=num,f=0;
	while(2*x<=num&&!f)
	{
		if(h[x]>h[x*2]) now=2*x;
		if(2*x+1<=num&&h[now]>h[x*2+1]) now=x*2+1;
		if(now!=x)
		{
			swap(h[now],h[x]);
			x=now;
		}
		else f=1;
	}
}
void pushup(int x)
{
	int v=0;
	if(x==1) return;
	while(x!=1&&!v)
	{
		if(h[x]<h[x/2]) swap(h[x],h[x/2]);
		else v=1;
		x/=2;
	}
	return;
}
int main()
{
	int i,j;
	scanf("%d",&T);
	while(T)
	{
		int a,x;
		scanf("%d",&a);
		if(a==1)
		{
			scanf("%d",&x);
			h[++num]=x;
			int A=num;
			pushup(A);
			
		}
		if(a==2)
		{
			printf("%d\n",h[1]);
		}
		if(a==3)
		{
			swap(h[1],h[num]);
			num--;
			pushdown(1);
		}
		--T;
	}
	return 0;
}

CPP
#include <iostream>
#include <stdio.h>
using namespace std;
int T,h[3500000],num;
void pushup()
{
	int i=num;
	while(i/2)
	{
		if(h[i/2]>h[i]) swap(h[i/2],h[i]);
		i/=2;
	}
}
void pushdown(int x)
{
	int i=x;
	while(i*2<=num)
	{
		int c=0;
		if(h[i*2+1]<=num&&h[i*2+1]<h[i*2]) c=1;
		if(h[i]>h[i*2+c]) swap(h[i],h[i*2+c]),i=i*2+c;
		else break;
	}
}
int main()
{
	int i,j;
	scanf("%d",&T);
	while(T--)
	{
		int a,x;
		scanf("%d",&a);
		if(a==1)
		{
			scanf("%d",&x);
			h[++num]=x;
			pushup();
		}
		if(a==2) printf("%d\n",h[1]);
		if(a==3)
		{
			h[1]=h[num--];
			pushdown(1);
		}
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...