読者です 読者をやめる 読者になる 読者になる

日々精進

aikoと旅行とプログラミング

【ALDS1_9】C: Heaps - Priority Queue

問題

優先度付きキュー | アルゴリズムとデータ構造 | Aizu Online Judge

方針

  • 優先度付きキューを実装する問題
  • (体がしんどいので元気になったらしっかり書きます許して)

コード

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cctype>
#include<climits>
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<list>
#include<queue>
#include<deque>
#include<algorithm>
#include<numeric>
#include<utility>
#include<complex>
#include<memory>
#include<functional>

#define rep(i, n) REP(i, 0, n)
#define REP(i, a, n) for(int i = a ; i < (int)n ; i++)
#define MAX 2000000
#define INF (1<<30)
#define left(i) (i * 2);
#define right(i) (i * 2 + 1)

using namespace std;

int h;
int A[MAX+2];

void maxHeapify(int i){
  int r = right(i);
  int l = left(i);
  int _max = i;
  
  if(l <= h && A[l] > A[_max]) _max =l;
  if(r <= h && A[r] > A[_max]) _max = r;

  if(_max != i){
    swap(A[i], A[_max]);
    maxHeapify(_max);
  }
}

int extract(){
  if(h < 1) return -INF;
  int maxv = A[1];
  A[1] = A[h];
  h--;
  maxHeapify(1);
  return maxv;
}

void insert(int x){
  h++;
  A[h] = -INF;
  if(x < A[h]) return;
  
  A[h] = x;
  int i = h;
  while(i > 1 && A[i/2] < A[i]){
    swap(A[i/2], A[i]);
    i /= 2;
  }
  
}

signed main(){
  string command;
  int n;
  h = 0;
  while(true){
    cin >> command;    
    if(command == "end") break;
    if(command == "insert"){
      cin >> n;
      insert(n);
    }else{
      cout << extract() << endl;;
    }
    
  }
}

風邪ひきながらといたので, 定数の0が1つ足りなくて小一時間悩むというミスをした. 元気なときにやらないとダメだね.