bzoj 3224 Tyvj 1728 普通平衡樹

題目大意:

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

1. 插入x數

2. 刪除x數(若有多個相同的數,因只刪除一個)

3. 查詢x數的排名(若有多個相同的數,因輸出最小的排名)

4. 查詢排名為x的數

5. 求x的前驅(前驅定義為小于x,且最大的數)

6. 求x的后繼(后繼定義為大于x,且最小的數)

思路:

直接splay

今天才敲。。。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cmath>
  4 #include<cstdlib>
  5 #include<cstring>
  6 #include<algorithm>
  7 #include<vector>
  8 #include<queue>
  9 #define inf 2139062143
 10 #define ll long long
 11 #define MAXN 100100 
 12 #define MOD 1000000007
 13 using namespace std;
 14 inline int read()
 15 {
 16     int x=0,f=1;char ch=getchar();
 17     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
 18     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
 19     return x*f;
 20 }
 21 int ch[MAXN][2],fa[MAXN],sz,cnt[MAXN],val[MAXN],size[MAXN],rt;
 22 int which(int x) {return x==ch[fa[x]][1];}
 23 int find_pre()
 24 {
 25     int pos=ch[rt][0];
 26     while(ch[pos][1]) pos=ch[pos][1];
 27     return pos;
 28 }
 29 int find_sub()
 30 {
 31     int pos=ch[rt][1];
 32     while(ch[pos][0]) pos=ch[pos][0];
 33     return pos;
 34 }
 35 void upd(int x)
 36 {
 37     if(!x) return ;
 38     size[x]=cnt[x]+size[ch[x][1]]+size[ch[x][0]];
 39 }
 40 void rotate(int pos)
 41 {
 42     int f=fa[pos],ff=fa[f],k=which(pos);
 43     ch[f][k]=ch[pos][k^1],fa[ch[f][k]]=f,fa[f]=pos,ch[pos][k^1]=f,fa[pos]=ff;
 44     if(ff) ch[ff][ch[ff][1]==f]=pos;
 45     upd(f);upd(pos);
 46 }
 47 void splay(int x)
 48 {
 49     for(int f;f=fa[x];rotate(x))
 50         if(fa[f]) rotate((which(x)==which(f)?f:x));
 51     rt=x;
 52 }
 53 void Insert(int x)
 54 {
 55     int pos=rt,f=0;
 56     while(1)
 57     {
 58         if(val[pos]==x) {cnt[pos]++,upd(pos);upd(f);splay(pos);return ;}
 59         f=pos,pos=ch[pos][x>val[pos]];
 60         if(!pos)
 61         {
 62             ch[++sz][0]=ch[sz][1]=0,fa[sz]=f,val[sz]=x,cnt[sz]=size[sz]=1,ch[f][x>val[f]]=sz;
 63             upd(f);splay(sz);return ;
 64         }
 65     }
 66 }
 67 void insert(int x)
 68 {
 69     if(!rt) {val[++sz]=x,ch[sz][0]=ch[sz][1]=fa[sz]=0,cnt[sz]=size[sz]=1,rt=sz;return;}
 70     Insert(x);
 71 }
 72 int find_rank(int x)
 73 {
 74     int res=0,pos=rt;
 75     while(1)
 76     {
 77         if(x<val[pos]) pos=ch[pos][0];
 78         else
 79         {
 80             res+=size[ch[pos][0]];
 81             if(val[pos]==x) {splay(pos);return res+1;}
 82             res+=cnt[pos],pos=ch[pos][1];
 83         }
 84     }
 85 }
 86 int find_num(int x)
 87 {
 88     int tmp=0,pos=rt;
 89     while(1)
 90     {
 91         if(ch[pos][0]&&x<=size[ch[pos][0]]) pos=ch[pos][0];
 92         else
 93         {
 94             tmp=size[ch[pos][0]]+cnt[pos];
 95             if(x<=tmp) return val[pos];
 96             x-=tmp,pos=ch[pos][1];
 97         }
 98     }
 99 }
100 void dlt(int x)
101 {
102     find_rank(x);
103     if(cnt[rt]>1) {cnt[rt]--;return ;}
104     if(!ch[rt][0]&&!ch[rt][1]) {rt=0;return ;}
105     if(!ch[rt][0]||!ch[rt][1])
106     {
107         int k=!ch[rt][1]?0:1;
108         rt=ch[rt][k],fa[rt]=0;
109         return ;
110     }
111     int k=find_pre(),tmp=rt;
112     splay(k);fa[ch[tmp][1]]=rt;
113     ch[rt][1]=ch[tmp][1],rt=k;
114 }
115 int main()
116 {
117     int T=read(),opt,x;
118     while(T--)
119     {
120         opt=read(),x=read();
121         if(opt==1) insert(x);
122         if(opt==2) dlt(x);
123         if(opt==3) printf("%d\n",find_rank(x));
124         if(opt==4) printf("%d\n",find_num(x));
125         if(opt==5) {insert(x);printf("%d\n",val[find_pre()]);dlt(x);}
126         if(opt==6) {insert(x);printf("%d\n",val[find_sub()]);dlt(x);}
127     }
128 }
View Code

?

轉載于:https://www.cnblogs.com/yyc-jack-0920/p/8047274.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252677.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252677.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252677.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

不懂毫米波雷達?5分鐘讀懂毫米波雷達的那些事兒

2019年是毫米波風生水起的一年&#xff0c;也是毫米波名聲大噪的一年。毫米波應用范圍廣泛&#xff0c;如毫米波雷達、毫米波天線等。而本文&#xff0c;將向大家介紹毫米波雷達&#xff0c;主要內容包括&#xff1a;毫米波雷達原理、毫米波雷達主要特點、毫米波雷達優勢以及毫…

飛鴿傳書(IPMSG)協議(翻譯稿)

協議聲明&#xff1a; 本協議是由日本人Shirouzu Hiroaki &#xff08;白水 啟章&#xff09;先生編寫。 wanpengcoder翻譯于Mr.Kanazawa英文文檔&#xff0c;轉載請注明出處。 http://www.cnblogs.com/wanpeng/ 如有翻譯不當之處望提出&#xff0c;以便改進&#xff0c;衷心感…

redis集群的搭建

########環境######### centos 7.2 , gcch 環境ruby 2.0.0 redis 3.2.8 redis-3.3.3gem 公司要求搭建redis集群, 本來覺得挺好搞的,沒想到弄到現在.... 1, 環境準備 gcc , ruby 等環境準備 yum -y install gcc ruby ruby-devel rubygems rpm-build zlib redis-ruby接口安裝, 我…

2017-2018-1 20155227 《信息安全系統設計基礎》第十三周學習總結

2017-2018-1 20155227 《信息安全系統設計基礎》第十三周學習總結 找出全書你認為最重要的一章&#xff0c;深入重新學習一下&#xff0c;要求&#xff08;期末占10分&#xff09;&#xff1a; 完成這一章所有習題詳細總結本章要點給你的結對學習搭檔講解你的總結并獲取反饋我選…

進程間五種通信方式

進程間通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同進程之間傳播或交換信息。 IPC的方式通常有管道&#xff08;包括無名管道和命名管道&#xff09;、消息隊列、信號量、共享存儲、Socket、Streams等。其中 Socket和Streams支持不同主機…

電子書下載:Silverlight 5 in Action

下載&#xff1a;http://www.ctdisk.com/file/8447319

git 的使用方法

git 的使用有3個主要步驟&#xff1a; 1.1 工作區域操作&#xff1a; 在自己的git賬號下構建一個工作目錄&#xff0c; 并往工作目錄里添加文件內容&#xff08;cp /root/data/VIP_Amount_prediction/* ./&#xff09;。 cd 當前工作目錄&#xff0c; git init&#xff0c; 初始…

Codeforces 898E Squares and not squares

題目大意 給定 $n$&#xff08;$n$ 是偶數&#xff0c;$2\le n\le 2\times 10^{5}$&#xff09;個非負整數 $a_1,\dots, a_n$&#xff08;$a_i\le 10^9$&#xff09;。 要求將其中 $n/2$ 個數變成平方數&#xff0c;另外 $n/2$ 個數變成非平方數&#xff0c;變化后的數必須仍是…

UTC時間

每個地區都有自己的本地時間&#xff0c;在網上以及無線電通信中時間轉換的問題就顯得格外突出。我自己就經常混淆于此&#xff0c;特地研究了一下&#xff0c;記錄在此以備忘。 整個地球分為二十四時區&#xff0c;每個時區都有自己的本地時間。在國際無線電通信場合&#xff…

Virtualbox橋接網卡設置

正常情況下&#xff0c;像設置virtualbox虛擬機的橋接網卡非常簡單&#xff0c;只需要點配置&#xff0c;然后在配置界面點擊網絡&#xff0c;然后在右邊的網絡里選擇橋接網絡即可。但是如果這么簡單就好了&#xff0c;今天要說的就是在不正常的情況下是怎么設置的。 工具/原料…

利用CSS、JavaScript及Ajax實現圖片預加載的三大方法

預加載圖片是提高用戶體驗的一個很好方法。圖片預先加載到瀏覽器中&#xff0c;訪問者便可順利地在你的網站上沖浪&#xff0c;并享受到極快的加載速度。這對圖片畫廊及圖片占據很大比例的網站來說十分有利&#xff0c;它保證了圖片快速、無縫地發布&#xff0c;也可幫助用戶在…

ThinkJS前端搭配vue時的Nginx配置

Thinkjs 作為奇舞團開源的nodejs mvc框架之一&#xff0c;引起了很多NodeJS程序員的親賴。但是其關于靜態文件處理部分支持不夠完善&#xff0c;主要是體現在SPA單頁應用&#xff0c;之前在ThinkJS 2.*版本時寫過一個關于處理單頁應用靜態資源的middleware think-resource-spa,…

SQL疑難雜癥【4 】大量數據查詢的時候避免子查詢

前幾天發現系統變得很慢&#xff0c;在Profiler里面發現有的SQL執行了幾十秒才返回結果&#xff0c;當時的SQL如下&#xff1a; 可以看得出來&#xff0c;在652行用了子查詢&#xff0c;恰巧目標表(QS_WIP)中的記錄數為100000000&#xff0c;通過如下SQL可以得到&#xff1a; S…

2020-11-27

總結各種RGB轉YUV的轉換公式 如果數據位寬都以8位來說.ITU709:允許 0~255之間所有數據 ITU601:只允許 16~235之間數據, 601是SDTV的數據結構&#xff1b; 656是SDTV的interface 709是HDTV的數據結構 &#xff1b;1120是HDTV的interface 最近在學習視頻的顏色空間轉換&#x…

python學習筆記1-基礎語法

1 在3版本中print需要加上括號2 多行語句&#xff1a;用\連接 1 item_one1 2 item_two2 3 item_three3 4 total item_one \ 5 item_two \ 6 item_three 7 print (total) 3 引號   字符串通常在引號中 不管是單引號 雙引號還是三引號   必須保證前后一致…

『原創』一個基于Win CE 5.0的Txt文件閱讀器

最近&#xff0c;拿到一臺親戚送的GPS導航儀&#xff0c;其系統是基于WinCE5.0的&#xff0c;所以我覺得可以寫點小程序上去&#xff0c;上網一搜&#xff0c;還附帶破解方法&#xff0c;把GPS破解后就變成一臺屏幕超大的PDA了&#xff0c;于是我想用它看電子書&#xff0c;無奈…

ARM Cortex-A系列(A53、A57、A73等)處理器性能分類與對比

在如今這個電子產品泛濫的年代&#xff0c;僅僅靠品牌或是外觀已經不足以辨別產品的優劣&#xff0c;其內置的處理器自然也就成為了分辨產品是否高端的標準之一。那么我們今天就不妨好好了解一下近幾年來電子產品中較為主流的RAM處理器。 在這之前讓我們先簡單認識一下處理器的…

批量創建10個系統帳號tianda01-tianda10并設置密碼

#1、添加用戶 useradd tianda01#2、非交互式給密碼 echo "pass"|passwd --stdin tianda#3、01-10 加0思路 (1)echo {00..10}(2)seq -w 10#隨機密碼6種方法 (1)echo $RANDOM | md5sum | cut -c 1-8(2)yum -y install expect mkpasswd -l 12 -d 5 #expect隨機mkpasswd …

DIV常用屬性大全自己整理

一、屬性列表 代碼如下:color : #999999 文字顏色 font-family : 宋體 文字字型 font-size : 10pt 文字大小 font-style:itelic 文字斜體育 font-variant:small-caps 小字體 letter-spacing : 1pt 文字間距 line-height : 200% 設定行高 font-weight:bold 文字粗體 vertical-a…

.NET 3.5 - DLINQ(LINQ to SQL)之面向對象的添加、查詢、更新和刪除

步步為營VS 2008 .NET 3.5(8) - DLINQ(LINQ to SQL)之面向對象的添加、查詢、更新和刪除作者&#xff1a;webabcd介紹以Northwind為示例數據庫&#xff0c;DLINQ(LINQ to SQL)之完全面向對象的添加操作、查詢操作、更新操作和刪除操作示例Sample.aspx <% Page Language&quo…