实现了交换、向上维护,向下维护的原子功能,其它插入、删除、修改的功能应该不在话下。
于是有了代码:(luogu3378模板题)
1 // luogu-judger-enable-o2 2 #include <cctype> 3 #include <cstdio> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn=1e6+5, INF=1e9; 8 int v[maxn], totn; 9 void ins(int x){ //插入值为x的点 10 int now; v[now=++totn]=x; 11 while (now!=1){ 12 if (v[now]<v[now>>1]) swap(v[now], v[now>>1]), now>>=1; 13 else break; 14 } 15 } 16 void del(int now){ //删除now号点(空间上不释放这个结点,结点个数也不减1,只是把它移到底部) 17 v[now]=INF; int p=0; 18 while ((now<<1)<=totn){ //当now还可以往下走时 19 if (v[now<<1]<v[now<<1|1]||(now<<1|1)>totn) p=0; else p=1; 20 swap(v[now], v[now<<1|p]); now=now<<1|p; 21 } 22 } 23 24 int n, op, t; 25 26 inline void get(int &x){ 27 char c; int flag=1; 28 for (; !isdigit(c=getchar()); ) if (c=='-') flag=-1; 29 for (x=c-48; c=getchar(), isdigit(c); ) 30 x=(x<<3)+(x<<1)+c-48; 31 if (flag==-1) x=-x; 32 } 33 34 int main(){ 35 get(n); 36 for (int i=1; i<=n; ++i){ 37 get(op); 38 if (op==1){ get(t); ins(t); } 39 if (op==2) printf("%d ", v[1]); 40 if (op==3) del(1); 41 } 42 return 0; 43 }