日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

zcmu-1954

發布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 zcmu-1954 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1954: #104. 普通平衡樹

Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 37 Solved: 18
[Submit][Status][Web Board]
Description

這是一道模板題。

您需要寫一種數據結構(可參考題目標題),來維護一些數,其中需要提供以下操作:

插入 x 數;
刪除 x數(若有多個相同的數,因只刪除一個);
查詢 x 數的排名(若有多個相同的數,因輸出最小的排名);
查詢排名為 x 的數;
求 x 的前趨(前趨定義為小于 x ,且最大的數);
求 x 的后繼(后繼定義為大于 x,且最小的數)。
Input

第一行為 n ,表示操作的個數,下面 n 行每行有兩個數 opt 和 x,opt 表示操作的序號(1≤opt≤6)。

Output

對于操作 3、4、5、6 每行輸出一個數,表示對應答案。

Sample Input

10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
Sample Output

106465
84185
492737
HINT

1≤n≤105,?107≤x≤107

思路:套模板題 自己對樹的理解不透徹 這題純粹的套他人模板。理解還是要的,畢竟模板不是萬能的。

ac代碼:

#include<bits/stdc++.h> using namespace std;struct treap {int l,r,sz,num,rd,val; }p[2000000];int m,size,root,ans;void update(int k) {p[k].sz=p[p[k].l].sz+p[p[k].r].sz+p[k].num; }void left_rotate(int &k) {int y=p[k].r;p[k].r=p[y].l;p[y].l=k;p[y].sz=p[k].sz;update(k);k=y; }void right_rotate(int &k) {int y=p[k].l;p[k].l=p[y].r;p[y].r=k;p[y].sz=p[k].sz;update(k);k=y; }void insert(int &k,int x) {if(k==0){++size;k=size;p[k].sz=p[k].num=1;p[k].val=x;p[k].rd=rand();return ;}++p[k].sz;if(p[k].val==x) p[k].num++;else if(x>p[k].val){insert(p[k].r,x);if(p[p[k].r].rd<p[k].rd) left_rotate(k);}else{insert(p[k].l,x);if(p[p[k].l].rd<p[k].rd) right_rotate(k);} }void del(int &k,int x) {if(k==0) return ;if(p[k].val==x){if(p[k].num>1){p[k].num--;p[k].sz--;return ;}if(p[k].r*p[k].l==0)k=p[k].l+p[k].r;else if(p[p[k].l].rd<p[p[k].r].rd) right_rotate(k),del(k,x);else left_rotate(k),del(k,x);}else if(x>p[k].val) --p[k].sz,del(p[k].r,x);else --p[k].sz,del(p[k].l,x); }int find_rank(int k,int x) {if(k==0) return 0;if(p[k].val==x) return p[p[k].l].sz+1;elseif(x>p[k].val) return p[p[k].l].sz+p[k].num+find_rank(p[k].r,x);else return find_rank(p[k].l,x); }int rerank(int k,int x) {if(k==0) return 0;if(x<=p[p[k].l].sz) return rerank(p[k].l,x);else if(x>p[p[k].l].sz+p[k].num)return rerank(p[k].r,x-p[p[k].l].sz-p[k].num);else return p[k].val; }void succ(int k,int x) {if(k==0) return ;if(p[k].val>x){ans=k;succ(p[k].l,x);}else succ(p[k].r,x); }void pred(int k,int x) {if(k==0)return ;if(p[k].val<x){ans=k;pred(p[k].r,x);}else pred(p[k].l,x); } int main() {cin>>m;int t1,t2;for(int i=1;i<=m;i++){cin>>t1>>t2;ans=0;if(t1==1)insert(root,t2);if(t1==2)del(root,t2);if(t1==3)cout<<find_rank(root,t2)<<endl;if(t1==4)cout<<rerank(root,t2)<<endl;if(t1==5){pred(root,t2);cout<<p[ans].val<<endl;}if(t1==6){succ(root,t2);cout<<p[ans].val<<endl;}}return 0; }

總結

以上是生活随笔為你收集整理的zcmu-1954的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。