樹狀陣列求第K大 離散化 入門例題

2021-09-17 02:43:31 字數 1092 閱讀 3299

插入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 106465

4 11 317721

1 460929

1 644985

1 84185

1 89851

6 81968

1 492737

5 493598

輸出樣例#1:複製

106465

84185

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大用什麼來記錄呢?主席樹?不...