插入xx數
刪除xx數(若有多個相同的數,因只刪除乙個)
查詢xx數的排名(排名定義為比當前數小的數的個數+1+1。若有多個相同的數,因輸出最小的排名)
查詢排名為xx的數
求xx的前驅(前驅定義為小於xx,且最大的數)
求xx的後繼(後繼定義為大於xx,且最小的數)
輸入格式:
第一行為nn,表示操作的個數,下面nn行每行有兩個數optopt和xx,optopt表示操作的序號( 1 \leq opt \leq 61≤opt≤6 )
輸出格式:
對於操作3,4,5,63,4,5,6每行輸出乙個數,表示對應答案
輸入樣例#1:複製
10輸出樣例#1:複製1 106465
4 11 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
10646584185
492737
#includeusing namespace std;
//思路 離散化 之後插入刪除都是離散化之後的資料 查詢排名即是查詢和 查詢第幾名是所 規劃發布
int n,opt[100001],res[100020],tot,val[102200],num[100201],sz;
int pos(int x)
void add(int x,int k)
int sum(int x)
int find_k(int x)
return num[ans+1];
}int main()
sort(num+1,num+tot+1);
sz=unique(num+1,num+1+tot)-num-1;
for(int i=1;i<=n;i++)
} return 0;
}
POJ 2299 樹狀陣列入門 離散化入門
思路見注釋,套兩個模板就好,沒什麼技巧 理解了快速排序的時間複雜度 不難發現這道題是乙個 純樹狀陣列 逆序對 直接套模板就好了 樹狀陣列每個結點存放的是小於等於該結點的value 逆序對公式 逆序對 大於該value的個數 因為樹狀陣列的n取決於序列的最大值 所以套個離散化模板就好了 離散化模板為不...
單峰陣列求第k大演算法
單峰陣列實際上可以看成兩個有序的陣列,這個問題就轉變成了兩個有序陣列求第k大。容易想到的演算法是對這兩個陣列進行歸併,生成乙個新的有序陣列,求出第k大之後就可以立刻停止,複雜度是o k 的。但是還有更優的演算法,可以使用分治的思想 實際上也是一種二分 來計算。對於兩個有序的陣列a和b,取出他們第k ...
POJ 2985 並查集 樹狀陣列第K大
poj 2985 並查集 樹狀陣列第k大 題目鏈結 題意 給你貓的編號1 n,m次操作,0操作可以把兩隻貓放到一組,1操作詢問貓的當前第k大組的容量是多少。思路 首先0操作可以利用並查集的合併操作,用乙個size陣列紀錄組的容量,每次合併的時候就更新size,那麼查詢第k大用什麼來記錄呢?主席樹?不...