題目在這裡
題意:讓你實現一棵樹,實現
插入,刪除,
查詢x數的排名,
查詢排名為x的數
,求x的前驅(前驅定義為小於x,且最大的數),
求x的後繼(後繼定義為大於x,且最小的數)
這道題最開始我用treap過了,今天打了乙個splay題解。
treap題解
#include #include #include using namespace std;
namespace splay
void up(const int &u)
//x become the father of y
void rot(const int &x, const int& d)
ch[x][d] = y; fa[y] = x;
up(y); up(x);
} //tag become x's father
void splay(const int &x, const int &tag) else
} if (!tag) root = x; }
void ins(int &x, const int &val, const int &p) else }
void insert(const int &val)
int find(int x, const int &val)
//delete root
void del()
if( !ch[root][0] )else }
void delete(const int& val)
int kth(int u, int k)
int rank(int u, int val)
int pred(int u, int val)
int succ(int u, int val)
}int main()
return 0;
}
xgtao用vector過了,我就納悶怎麼沒超時。。。。。我沒有他的**,不過這裡有乙份vector的**。
#include #include #include using namespace std;
vectors;
int main()
}
比較一下三種方法效率:
memory time
treap : 3664
kb364
mssplay: 3636
kb696
msvector
: 1684 kb1692 ms
bzoj3224普通平衡樹
您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3.查詢x數的排名 若有多個相同的數,因輸出最小的排名 4.查詢排名為x的數 5.求x的前驅 前驅定義為小於x,且最大的數 6.求x的後繼 後繼定義為大於x,且最小的...
BZOJ3224 普通平衡樹
題目傳送門 您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3.查詢x數的排名 若有多個相同的數,因輸出最小的排名 4.查詢排名為x的數 5.求x的前驅 前驅定義為小於x,且最大的數 6.求x的後繼 後繼定義為大於...
BZOJ3224 普通平衡樹
您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3.查詢x數的排名 若有多個相同的數,因輸出最小的排名 4.查詢排名為x的數 5.求x的前驅 前驅定義為小於x,且最大的數 6.求x的後繼 後繼定義為大於x,且最小的...