先把代码附上。
maxwhut2017 | 3481 | Accepted | 184K | 297MS |
//POJ3481
#include <iostream>#include <cstdio>using namespace std;
struct pnt{int v;
int r;
pnt* ch[2];
};
pnt *top=NULL;
bool empty=1;
void insert(int v, int r, pnt &p, bool ok){
if(ok||empty==1){
p.v=v;
p.r=r;
p.ch[0]=p.ch[1]=NULL;
}
else if(r>p.r){
if(p.ch[1]==NULL){
p.ch[1]=new pnt();
insert(v,r,*p.ch[1],1);
}
else insert(v,r,*p.ch[1],0);
}
else if(r<p.r){
if(p.ch[0]==NULL){
p.ch[0]=new pnt();
insert(v,r,*p.ch[0],1);
}
else insert(v,r,*p.ch[0],0);
}
empty=0;
}
bool find(int dir, pnt* p, int cur){
if(empty==1){printf("0\n");return 1;}
else if((*p).ch[dir]==NULL){
printf("%d\n",(*p).v);
if(cur==1){
if((*p).ch[dir^1]==NULL){
empty=1;
top=NULL;
}
else top=(*p).ch[dir^1];
delete p;
}
return 1;
}
else {
bool ok=find(dir,(*p).ch[dir],cur+1);
if(ok){
pnt *del=(*p).ch[dir];
(*p).ch[dir]=(*(*p).ch[dir]).ch[dir^1];
delete del;
}
return 0;
}
}
int main()
{
int order;while(scanf("%d",&order)&&order){
if(order==1){
int v,r;scanf("%d%d",&v,&r);
if(top==NULL)top=new pnt();
insert(v,r,*top,0);
}
else if(order==2){
if(top==NULL)top=new pnt();
find(1,top,1);
}
else if(order==3){
if(top==NULL)top=new pnt();
find(0,top,1);
}
}
return 0;
}
很水的一个题目,堪称POJ大水题。