題目描述 您需要寫一種數據結構(可參考題目標題),來維護一些數,其中需要提供以下操作: 插入x數 刪除x數(若有多個相同的數,因只刪除一個) 查詢x數的排名(若有多個相同的數,因輸出最小的排名) 查詢排名為x的數 求x的前驅(前驅定義為小於x,且最大的數) 輸入輸出格式 輸入格式: 第一行為n,表示 ...
題目描述
您需要寫一種數據結構(可參考題目標題),來維護一些數,其中需要提供以下操作:
-
插入x數
-
刪除x數(若有多個相同的數,因只刪除一個)
-
查詢x數的排名(若有多個相同的數,因輸出最小的排名)
-
查詢排名為x的數
-
求x的前驅(前驅定義為小於x,且最大的數)
- 求x的後繼(後繼定義為大於x,且最小的數)
輸入輸出格式
輸入格式:
第一行為n,表示操作的個數,下麵n行每行有兩個數opt和x,opt表示操作的序號(1<=opt<=6)
輸出格式:
對於操作3,4,5,6每行輸出一個數,表示對應答案
輸入輸出樣例
輸入樣例#1:10 1 106465 4 1 1 317721 1 460929 1 644985 1 84185 1 89851 6 81968 1 492737 5 493598輸出樣例#1:
106465 84185 492737
說明
時空限制:1000ms,128M
1.n的數據範圍:n<=100000
2.每個數的數據範圍:[-1e7,1e7]
來源:Tyvj1728 原名:普通平衡樹
在此鳴謝
頹廢的時候閑來無事研究一下pb_ds,,
想象一下在考場上別人花n個小時寫平衡樹調平衡樹,而你五分鐘就秒了的快感
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<ext/pb_ds/tree_policy.hpp> 6 #include<ext/pb_ds/assoc_container.hpp> 7 #include<algorithm> 8 #define lli long long 9 using namespace std; 10 using namespace __gnu_pbds; 11 void read(lli &n) 12 { 13 char c='+';lli x=0;bool flag=0; 14 while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;} 15 while(c>='0'&&c<='9'){x=x*10+(c-48);c=getchar();} 16 flag==1?n=-x:n=x; 17 } 18 tree<lli,null_type,std::less<lli>,splay_tree_tag,tree_order_statistics_node_update>st; 19 int main() 20 { 21 ios::sync_with_stdio(0); 22 lli T; 23 lli ans,x,y; 24 cin>>T; 25 for(lli i=1;i<=T;i++) 26 { 27 28 //read(x);read(y); 29 cin>>x>>y; 30 if(x==1) st.insert((y<<20)+i); 31 else if(x==2)st.erase(st.lower_bound(y<<20)); 32 else if(x==3)printf("%lld\n",st.order_of_key(y<<20)+1); 33 else 34 { 35 if(x==4)ans=*st.find_by_order(y-1); 36 if(x==5)ans=*--st.lower_bound(y<<20); 37 if(x==6)ans=*st.lower_bound((y+1)<<20); 38 printf("%lld\n",ans>>20); 39 } 40 } 41 return 0; 42 }