社区讨论
堆模板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 条回复,欢迎继续交流。
正在加载回复...