#include#define abs(a,b) (a>b?a-b:b-a)優化**#define mod 1000000
#define mxn 80000+5
intread()
while(c>='
0'&&c<='9'
)
return x*w;
}int
ans;
struct
nodenode[mxn],*root,*recycle[mxn];
int n,p,x,node_num=-1,top=-1
;bool
tree_type;
void rotate(node *now)
if(f->left==now)
if(f->right==now)
f->fa=now;
if(now->fa==null) root=now;
return;}
void splay(node *now,node *des)
else
if(gf->right==f&&f->left==now)
else
if(gf->left==f&&f->left==now)
else
if(gf->right==f&&f->right==now)
}if(now->fa==null) root=now;
return;}
node* node_new(int vl,bool
typ)
else
n->val=vl;
n->type=typ;
n->left=null;
n->right=null;
n->fa=null;
returnn;}
void node_insert(node *now,node *v)
if(now==null)
if(v->val<=now->val)
else node_insert(now->left,v);
}if(v->val>now->val)
else node_insert(now->right,v);
}splay(v,null);
return;}
node*root_prev()
else
return
null;
}node*root_subs()
else
return
null;
}void node_delete(node *now)
if(now->left==null)
if(now->right==null)
node *l,*r;
l=now->left;
r=now->right;
l->fa=null;
node *t=now->left;
while(t->right!=null) t=t->right;
splay(t,null);
t->right=r;
r->fa=t;
root=t;
return;}
void ques(node *now)
else ans+=t1;
ans%=mod;
node_delete(now);
node_delete(a);
}return;}
intmain()
printf("%d
",ans);
return0;
}
這次修改了一下上次寫的**。
由於本人建樹的方法屬於靜態分配記憶體(動態分配總會出現玄學錯誤...),因此記憶體空間要開很大很大才不會re,刪除節點後,上一次的**沒有垃圾**,導致空間複雜度稍大(上一次大約o(5n)才過去)。
這次開了乙個棧,命名為recycle**站,每次刪除節點後,位址丟到**站,創造新節點時,先檢查**站裡有沒有空閒位址,有就用,沒有才在靜態記憶體空間裡找乙個位址分配。這樣空間複雜度變為了o(2n),降低了很多(實際上從4.31mb降到了2.21mb)。
不過感覺回頭還是學一下動態分配吧...
洛谷P2286 寵物收養場 Treap
一家寵物收養場會陸續到來一些收養人和寵物。每個收養人個寵物都有乙個權值k kk。如果某個時刻收養人多於寵物,那麼新進來乙個寵物就會選擇權值與自己最接近的收養人,若有兩個收養人的權值分別 為k a k a k a,k a k a,k a,那麼寵物將選擇權值小的收養人。當收養人少於寵物時,收養人就會選擇...
洛谷P2286 HNOI2004 寵物收養場
凡凡開了一間寵物收養場。收養場提供兩種服務 收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自己滿意的寵物,凡凡根據領養者的要求通過他自己發明的乙個特殊的公式,得出該領養者希望領養的寵物的特點值a a是乙個正整數,a 2 31 而他也給每個處在收養場的寵物乙個特點值。這樣他就能夠...
洛谷P2286 HNOI2004 寵物收養場
凡凡開了一間寵物收養場。收養場提供兩種服務 收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自己滿意的寵物,凡凡根據領養者的要求通過他自己發明的乙個特殊的公式,得出該領養者希望領養的寵物的特點值a a是乙個正整數,a 2 31 而他也給每個處在收養場的寵物乙個特點值。這樣他就能夠...