題目描述
這是一道模板題,其資料比「普通平衡樹」更強。
如未特別說明,以下所有資料均為整數。
維護乙個多重集 s s s ,初始為空,有以下幾種操作:
把 x x x 加入 s s s
刪除 s s s 中的乙個 x x x,保證刪除的 x x x 一定存在
求 s s s 中第 k k k 小
求 s s s 中有多少個元素小於 x x x
求 s s s 中小於 x x x 的最大數
求 s s s 中大於 x x x 的最小數
操作共 n n n 次。
輸入格式
第一行乙個整數 n n n,表示共有 n n n 次操作 。
接下來 n n n 行,每行為以下幾種格式之一 :
輸出格式
對於每次詢問,輸出單獨一行表示答案。
樣例樣例輸入
5
0 30 4
2 21 4
3 3
樣例輸出
4
0
資料範圍與提示
1≤n≤3×105,0≤x≤109 1 \leq n \leq 3 \times 10 ^ 5, 0 \leq x \leq 10 ^ 9 1≤n≤3×105,0≤x≤109
**(旋轉treap):
#include using namespace std;
const int inf=1e9+7;
const int max=300005;
int n,m,tot,root=1,ans;
struct shu;
shu a[max];
inline int get_int()
inline void print(int x)
inline int new(int x)
inline void update(int p)
inline void build()
inline void zig(int &p)
inline void zag(int &p)
inline void insert(int &p,int x)
if(a[p].num==x)
if(xa[p].data) zig(p);
} else
update(p);
}inline void remove(int &p,int x)
if(a[p].l||a[p].r)
else p=0;
return;
} if(x=x) return val(a[p].l,x);
if(a[a[p].l].size+a[p].cnt>=x) return a[p].num;
return val(a[p].r,x-a[a[p].l].size-a[p].cnt);
}inline int sum(int p,int x)
inline int nxt(int p,int x)
int main()
} return 0;
}
CSUOJ 1258 維護序列
線段樹題目。此題的更新必須要更新到葉節點,否則的話,會出現錯誤。對於乙個int範圍內的數字,更新若干次 最多32次 後必然會變成0,那麼此時在更新就沒有意義了。那麼我們可以用lazy標記,當某個區間的數字全部變為0後,我們將這個區間做上標記。那麼這個區間就不可能在被更新,這樣就可以提高效率,減去不必...
bzoj 2453 維護佇列
你小時候玩過彈珠嗎?小朋友a有一些彈珠,a喜歡把它們排成佇列,從左到右編號為1到n。為了整個佇列鮮豔美觀,小朋友想知道某一段連續彈珠中,不同顏色的彈珠有多少。當然,a有時候會依據個人喜好,替換佇列中某個彈珠的顏色。但是a還沒有學過程式設計,且覺得頭腦風暴太浪費腦力了,所以向你來尋求幫助。輸入檔案第一...
BZOJ 1798 維護序列
線段樹 這 d 道 q 題 s 告訴我說 你沒學過線段樹 嗯 這題要好好想想 qaq 來吧首先要明確的事情是 delta now 記錄的是已經對當前點做過的,但是還沒有對當前點的兒子做過的操作 嗯 我們就這樣 慢慢的退一下 嗯 標記是給兒子用的 嗯 是給兒子用的 奉獻精神 然後,對於這個題,我們可以...