赛前写挂板子错误整理
P3378 【模板】堆
封装版:
#include<cstdio>
#define rg register
#define ci const int
#define cl const long long int
typedef long long int ll;
namespace IO {
char buf[300];
}
template <typename T>
inline void qr(T &x) {
rg char ch=getchar(),lst=' ';
while((ch > '9') || (ch < '0')) lst=ch,ch=getchar();
while((ch >= '0') && (ch <= '9')) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
if(lst == '-') x=-x;
}
template <typename T>
inline void qw(T x,const char aft,const bool pt) {
if(x < 0) {putchar('-');x=-x;}
rg int top=0;
do {
IO::buf[++top]=x%10+'0';
} while(x/=10);
while(top) putchar(IO::buf[top--]);
if(pt) putchar(aft);
}
template <typename T>
inline T mmax(const T a,const T b) {return a > b ? a : b;}
template <typename T>
inline T mmin(const T a,const T b) {return a < b ? a : b;}
template <typename T>
inline T mabs(const T a) {return a < 0 ? -a : a;}
template <typename T>
inline void mswap(T &a,T &b) {
T _temp=a;a=b;b=_temp;
}
const int maxn = 1000010;
template <typename T>
struct Heap{
T heap[maxn];
int hcnt;
inline bool empty() {return !hcnt;}
inline int sz() {return hcnt;}
void push(const T &x) {
int pos;
heap[pos=++hcnt]=x;
while(pos != 1) {
int fa = pos>>1;
if(heap[pos] < heap[fa]) mswap(heap[fa],heap[pos]);
pos>>=1;
}
}
void pop() {
int pos;
heap[pos=1]=heap[hcnt--];
while((pos<<1) <= hcnt) {
int s=pos<<1;
if((s < hcnt) && (heap[s|1] < heap[s])) s|=1;
if(heap[pos] > heap[s]) mswap(heap[pos],heap[s]);
pos=s;
}
}
inline T top() {
return heap[1];
}
};
Heap<int>Q;
int n;
int main() {
qr(n);
int a;
while(n--) {
a=0;qr(a);
if(a == 1) {
a=0;qr(a);Q.push(a);
} else if(a == 2) {
qw(Q.top(),'\n',true);
} else {
Q.pop();
}
}
return 0;
}
未封装:
#include<cstdio>
#define rg register
#define ci const int
#define cl const long long int
typedef long long int ll;
namespace IO {
char buf[300];
}
template <typename T>
inline void qr(T &x) {
rg char ch=getchar(),lst=' ';
while((ch > '9') || (ch < '0')) lst=ch,ch=getchar();
while((ch >= '0') && (ch <= '9')) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
if(lst == '-') x=-x;
}
template <typename T>
inline void qw(T x,const char aft,const bool pt) {
if(x < 0) {putchar('-');x=-x;}
rg int top=0;
do {
IO::buf[++top]=x%10+'0';
} while(x/=10);
while(top) putchar(IO::buf[top--]);
if(pt) putchar(aft);
}
template <typename T>
inline T mmax(const T a,const T b) {return a > b ? a : b;}
template <typename T>
inline T mmin(const T a,const T b) {return a < b ? a : b;}
template <typename T>
inline T mabs(const T a) {return a < 0 ? -a : a;}
template <typename T>
inline void mswap(T &a,T &b) {
T _temp=a;a=b;b=_temp;
}
const int maxn = 1000010;
int n,hcnt;
int heap[maxn];
void add(ci);
int ask();
void dlt();
int main() {
qr(n);
int a;
while(n--) {
a=0;qr(a);
if(a == 1) {
a=0;qr(a);add(a);
} else if(a == 2) {
qw(ask(),'\n',true);
} else {
dlt();
}
}
return 0;
}
void add(ci x) {
int pos;
heap[pos=++hcnt]=x;
while(pos != 1) {
int fa=pos>>1;
if(heap[fa] > heap[pos]) mswap(heap[pos],heap[fa]);
pos>>=1;
}
}
inline int ask() {return heap[1];}
void dlt() {
int pos;
heap[pos=1]=heap[hcnt--];
while((pos << 1) <= hcnt) {
int s=pos<<1;
if((s < hcnt) && (heap[s|1] < heap[s])) s|=1;
if(heap[s] < heap[pos]) mswap(heap[pos],heap[s]);
pos=s;
}
}
错误一:
删除函数中
while((pos<<1) <= hcnt)
小于等于写成小于
错误二:
删除函数中
pos=s;
写成pos<<=1。(因为可能pos=pos<<1|1)
错误三:
删除函数中
while((pos<<1) <= hcnt)
写成pos<=hcnt