HNOI2004 寵物收養所 SBT

2021-08-27 02:49:57 字數 1440 閱讀 9098

by---cxlove

在找前驅和後繼的時候,可能出現前驅和後繼不存在,應當返回inf才對。

每於一棵樹,要麼為空,要麼全為寵物或者全為人,加乙個標記,表示樹內現在的種類,對於乙個新進來的,判斷是否一致,一致則插入,否則找出乙個相鄰的刪掉。

#include#include#include#include#define n 100005

#define mod 1000000

#define inf 1<<29

using namespace std;

struct sbt

}t[n];

int root,tot; //根的位置以及節點個數

//左旋轉處理

void left_rot(int &x)

//右旋轉處理

void right_rot(int &x)

//調整處理

void maintain(int &r,bool flag)

else

return;

} else

else

return;

} //更新子樹,然後再更新根,直到平衡為止

maintain(t[r].left,false);

maintain(t[r].right,true);

maintain(r,false);

maintain(r,true);

}//插入新節點

void insert(int &r,int k)

else

}//刪除結點,利用的是前驅替換

int remove(int &r,int k)

else return remove(k=t[r].key)

return get_pre(t[r].right,r,k);

else

return get_pre(t[r].left,y,k);

}//獲得後繼

int get_next(int &r,int y,int k)

if(kt[r].key)

return get_rank(t[r].right,k)+t[t[r].left].size+1;

else

return t[t[r].left].size+1;

}//查詢樹中是否存在元素

int find(int &r,int k)

//排序

void inorder(int &r)

int main()

else

int a=get_pre(root,0,k);

int b=get_next(root,0,k);

if(abs(a-k)<=abs(b-k))

else

}} printf("%d\n",ans);

} return 0;

}

HNOI2004寵物收養所

time limit 10 sec memory limit 162 mb submit 2796 solved 995 submit status discuss 最近,阿q開了一間寵物收養所。收養所提供兩種服務 收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自己滿意的寵物,...

HNOI 2004 寵物收養所

題目鏈結 演算法 建兩棵平衡樹維護領養者和寵物的特點值,這兩棵平衡樹支援 插入刪除,查詢前驅和後繼 筆者的平衡樹選用的是treap,當然,splay,set等資料結構也是可以完成這個任務的 includeusing namespace std define maxn 80010typedef lon...

HNOI2004 寵物收養所

description 最近,阿q開了一間寵物收養所。收養所提供兩種服務 收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自己滿意的寵物,阿q根據領養者的要求通過他自己發明的乙個特殊的公式,得出該領養者希望領養的寵物的特點值a a是乙個正整數,a 2 31 而他也給每個處在收養所...