pat 1057 Stack 樹狀陣列 二分查詢

2021-08-13 05:41:23 字數 915 閱讀 1278

給我們乙個n表示運算元量 然後三種操作

push和pop 還有求中位數的操作

讓我們根據操作輸出正確的解

用sort排序做 或者 map標記法都會超時

考慮更快的方法

如何快速找到給定一串數的中位數

可以去索引 但是需要排序

題目中告訴我們每個元素都小於1e5

那麼也就是說 上下界已知

那麼求中位數 也就是求小於等於某個數的個數正好為所有數的一半

那麼求小於等於某個數的個數 可以用樹狀陣列去記錄

然後查中位數時 在樹狀陣列中二分小於等於的個數mid的元素的下界

樹狀陣列可以用來統計小於等於某元素的數量

#include

using

namespace

std;

/* 樹狀陣列中記錄的是小於當前元素的數量

由於樹狀陣列符合單調性 所以可以二分這個容量的中間值

*/char a[20];

int c[100003];

vector

s;void add(int x,int i)

}int sum(int x)

return ans;

}int find(int md)

return l;

}int main()

printf("%d\n",s[s.size()-1]);

add(s[s.size()-1],-1);

s.pop_back();

}else

if(a[1]=='u') else

int f = s.size()+1>>1;

printf("%d\n",find(f));}}

return

0;}

PAT 甲級 1057 Stack 樹狀陣列

題目大意 在stack的原有功能上增加了peekmedian功能,即排好序後求中位數 push key poppeekmedian 相應操作的值 演算法標籤 樹狀陣列 首先分析為什麼用樹狀陣列。顯然對於pop和push兩種操作無需考慮,在求中位數時候,為了得到中位數,顯然需要排序好的序列才能得到,如...

PAT 甲級真題 1057 Stack

題目鏈結 題解 題目就是求第k小元素問題。由於操作次數比較多,因此直接排序輸出中間元素會超時,因此這題要用到第k小元素的經典做法之一,樹狀陣列。用樹狀陣列來維護現在棧內元素的資訊,然後使用二分查詢中間元素的值。這樣時間複雜度是o n logn o nlogn o nlog n 實現細節見 inclu...

PAT乙級1057 數零壹

時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 chen,yue 給定一串長度不超過105的字串,本題要求你將其中所有英文本母的序號 字母a z對應序號1 26,不分大小寫 相加,得到整數n,然後再分析一下n的二進位制表示中有多少0 多...