HDU1509

<!-- lang: cpp -->
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

struct Node
{
     char str_command[300];
     int parameter;
     int priority;
     int index;

     bool operator < (const Node& a) const;
     bool operator > (const Node& a) const;
};

inline bool Node::operator < (const Node& a) const
{
     if(priority != a.priority)
          return priority<a.priority;
     else
          return index<a.index;
}

inline bool Node::operator > (const Node& a) const
{
     if(priority != a.priority)
          return priority>a.priority;
     else
          return index>a.index;
}

class Heap
{     
public:
     Heap(){size=0;}
     void push(const Node& value);
     Node top(){return _heap[1];}
     Node pop();
     bool isEmpty(){return size==0;}

private:
     Node _heap[60101];
     int size;

     void heapify_down(const int& pos);
     void heapify_up(const int& pos);
};



inline void Heap::push(const Node& value)
{
     _heap[++size]=value;
     heapify_up(size);
}

inline Node Heap::pop()
{
     Node ret=_heap[1];
     _heap[1]=_heap[size--];
     heapify_down(1);

     return ret;
}

inline void Heap::heapify_down(const int& pos)
{
     for(int i=pos;(i<<1)<=size;)
     {
          int s=i<<1,r=(i<<1)+1;
          if(r<=size && _heap[r]<_heap[s])
               s=r;

          if(_heap[i]>_heap[s])
          {
               swap(_heap[i],_heap[s]);
               i=s;
          }
          else
               break;
     }
}

inline void Heap::heapify_up(const int& pos)
{
     for(int i=pos;i>1;)
     {
          int s=i>>1;
          if(_heap[i]<_heap[s])
          {
               swap(_heap[i],_heap[s]);
               i=s;
          }
          else
               break;
     }
}

Heap heap;

int main()
{
     char buf[300];
     int index=0;

     while(cin>>buf)
     {
          if(strcmp("GET",buf)==0)
          {
               if(heap.isEmpty())
                    cout<<"EMPTY QUEUE!"<<endl;
               else
               {
                    Node output=heap.pop();
                    cout<<output.str_command<<' '<<output.parameter<<endl;
               }
          }
          else
          {
               index++;
               int par,pri;
               cin>>buf>>par>>pri;
               Node in;
               strcpy(in.str_command,buf);
               in.parameter=par;
               in.priority=pri;
               in.index=index;
               heap.push(in);
          }
     }

     return 0;
}

你可能感兴趣的:(HDU1509)