POJ 1442 Blackbox

Description

Our Black Box represents a primitive database. It can save an integer array and has a special i variable. At the initial moment Black Box is empty and i equals 0. This Black Box processes a sequence of commands (transactions). There are two types of transactions:

ADD (x): put element x into Black Box;
GET: increase i by 1 and give an i-minimum out of all integers containing in the Black Box. Keep in mind that i-minimum is a number located at i-th place after Black Box elements sorting by non- descending.

Let us examine a possible sequence of 11 transactions:

Example 1

N Transaction i Black Box contents after transaction Answer
(elements are arranged by non-descending)

1 ADD(3)      0 3   

2 GET         1 3                                    3

3 ADD(1)      1 1, 3   

4 GET         2 1, 3                                 3

5 ADD(-4)     2 -4, 1, 3   

6 ADD(2)      2 -4, 1, 2, 3   

7 ADD(8)      2 -4, 1, 2, 3, 8   

8 ADD(-1000)  2 -1000, -4, 1, 2, 3, 8   

9 GET         3 -1000, -4, 1, 2, 3, 8                1

10 GET        4 -1000, -4, 1, 2, 3, 8                2

11 ADD(2)     4 -1000, -4, 1, 2, 2, 3, 8   

It is required to work out an efficient algorithm which treats a given sequence of transactions. The maximum number of ADD and GET transactions: 30000 of each type.

Let us describe the sequence of transactions by two integer arrays:

  1. A(1), A(2), ..., A(M): a sequence of elements which are being included into Black Box. A values are integers not exceeding 2 000 000 000 by their absolute value, M <= 30000. For the Example we have A=(3, 1, -4, 2, 8, -1000, 2).

  2. u(1), u(2), ..., u(N): a sequence setting a number of elements which are being included into Black Box at the moment of first, second, ... and N-transaction GET. For the Example we have u=(1, 2, 6, 6).

The Black Box algorithm supposes that natural number sequence u(1), u(2), ..., u(N) is sorted in non-descending order, N <= M and for each p (1 <= p <= N) an inequality p <= u(p) <= M is valid. It follows from the fact that for the p-element of our u sequence we perform a GET transaction giving p-minimum number from our A(1), A(2), ..., A(u(p)) sequence.

Input

Input contains (in given order): M, N, A(1), A(2), ..., A(M), u(1), u(2), ..., u(N). All numbers are divided by spaces and (or) carriage return characters.
Output

Write to the output Black Box answers sequence for a given sequence of transactions, one number each line.

Sample Input

7 4
3 1 -4 2 8 -1000 2
1 2 6 6
Sample Output

3
3
1

問題分析與解題思路

題意

輸入一行數A[];再輸入一行數u[];讓你輸出前[]的前u[p]個數據中毙死,第p+1小的數流昏,正如給出的例子

7 4
3 1 -4 2 8 -1000 2
1 2 6 6
前1個數中第1小的數是3月洛;
前2個數中第2小的數是3愕把;
前6個數中第3小的數是1孩擂;
前6個數中第4小的數是2喂窟;

通過維護一個最大堆纽帖,一個最小堆進行求解抡四。

  • 最大堆中存放第1到第i-1小的數
  • 最小堆中存放第i-1到第n小的數(n為當前數字總數)

所以最小堆的堆頂就是我們要的結果柜蜈。

每插入一個數,我們先把它放入最小堆指巡,更新最小堆淑履,如果最小堆堆頂元素小于最大堆堆頂元素,說明前i-1個最小的數據需要更新藻雪,只要將小堆堆頂和大堆堆頂元素交換即可秘噪。再把最小堆的堆頂元素彈出輸出,然后賦值給最大堆堆頂勉耀。(因為下一次所求不是第i小而是第i+1小的元素)

數據結構與算法設計及其主要代碼段

定義堆

priority_queue<int> q2;  //最大堆(默認)指煎;
priority_queue<int,vector<int>,greater<int> > q1;//最小堆(自定義)

插入與get

for(i=0;i<m;i++)
    {
        scanf("%d",&k);
        while(j<k)
        {
            q1.push(A[j]);
            // 最小堆堆頂元素小于最大堆堆頂元素
            if(!q2.empty() && q1.top()<q2.top())
            {
                int t;
                t=q1.top();
                q1.pop();
                q1.push(q2.top());
                q2.pop();
                q2.push(t);
            }
            j++;
        }
        // 碰到get彈出輸出最小堆堆頂蹋偏,并加入最大堆
        printf("%d\n",q1.top());
        q2.push(q1.top());
        q1.pop();
    }

程序運行結果及分析

A. 算法復雜度

  • 建堆:O(n)
  • 插入刪除:O(logn)
  • 總的復雜度:O(n)

B. 運行時間

內存:2260kB, 時間:52ms(數據來自openjudge)

心得體會與總結

  1. 使用stl的priority_queue會讓本題難度降低很多。
  2. 本題最重要的就是想清楚兩個堆中所存的元素至壤,最大堆中存放第1到第i-1小的數暖侨,最小堆中存放第i-1到第n小的數(n為當前數字總數。
  3. 本題巧妙之處在于崇渗,一般堆都是用來解決最大字逗,最小問題,兩個堆的使用可以解決第k大/小問題宅广。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末葫掉,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子跟狱,更是在濱河造成了極大的恐慌俭厚,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驶臊,死亡現場離奇詭異挪挤,居然都是意外死亡,警方通過查閱死者的電腦和手機关翎,發(fā)現死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門扛门,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纵寝,你說我怎么就攤上這事论寨。” “怎么了爽茴?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵葬凳,是天一觀的道長。 經常有香客問我室奏,道長火焰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任胧沫,我火速辦了婚禮昌简,結果婚禮上,老公的妹妹穿的比我還像新娘琳袄。我一直安慰自己江场,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布窖逗。 她就那樣靜靜地躺著址否,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上佑附,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天樊诺,我揣著相機與錄音,去河邊找鬼音同。 笑死词爬,一個胖子當著我的面吹牛,可吹牛的內容都是我干的权均。 我是一名探鬼主播顿膨,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叽赊!你這毒婦竟也來了恋沃?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤必指,失蹤者是張志新(化名)和其女友劉穎囊咏,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體塔橡,經...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡梅割,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了葛家。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片户辞。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惦银,靈堂內的尸體忽然破棺而出咆课,到底是詐尸還是另有隱情,我是刑警寧澤扯俱,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站喇澡,受9級特大地震影響迅栅,放射性物質發(fā)生泄漏。R本人自食惡果不足惜晴玖,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一读存、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呕屎,春花似錦让簿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蹂安,卻和暖如春椭迎,著一層夾襖步出監(jiān)牢的瞬間锐帜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工畜号, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缴阎,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓简软,卻偏偏與公主長得像蛮拔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痹升,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容

  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,476評論 0 23
  • 在互聯網看來语泽,市場是瞬間即變的,市場的現實就是视卢,你以為看到的是變化踱卵,其實是變化之后的結果,這就意味著你已經失...
    阿毅閱讀 282評論 0 1
  • 距離自己辭職据过,已有整整一個月了惋砂。這一個月來我的心態(tài)由期待到焦慮最后變?yōu)榱穗S遇而安。有時候我也會想當初自己是不是真的...
    小小二愣子閱讀 279評論 0 0
  • 一個小鎮(zhèn)礦泉療養(yǎng)院里绳锅,三女五男在五天內上演了誘惑西饵、欺騙、亂性與“謀殺”的人生悲喜劇鳞芙。整個過程充滿巧合眷柔,卻又合情合理...
    何以故哉閱讀 998評論 14 23