Пример #1
0
void insert_review(long long val) {

    if (input < 3) {
        insert_max(val);
        return;
    }

    long third = input/3;
    long size = min_heap.size() - 1;
    long long temp;

    if (size < third) {
        // can add logic
        if (val > max_heap[1]) {
            insert_min(val);
        }
        else {
            temp = delete_max();
            if (temp != -1) insert_min(temp);
            insert_max(val);
        }
    }
    else {
        // can't add logic
        if (val > min_heap[1]) {
            temp = delete_min();
            insert_min(val);
            if (temp != -1) insert_max(temp);
        } else {
            insert_max(val);
        }
    }
}
void put_median(int num)
{
	int bal=check();
	if(bal>=1)
	{
		if(num>=median)
		{
			insert_min(num);
		}
		else
		{
			insert_min(maxheap[1]);
			maxheap[1]=maxheap[maxheap[0]];
			maxheap[0]--;
			max_heapify(1);
			insert_max(num);
		}
	}
	else
	{
		if(num>median)
		{
			insert_min(num);
			insert_max(minheap[1]);
			minheap[1]=minheap[minheap[0]];
			minheap[0]--;
			min_heapify(1); 
		}
		else
		{
			insert_max(num);
		}
	}
	return;
}
Пример #3
0
 void addNum(int num) {
     if(heap_min.size() + heap_max.size() < 2) {
         if(heap_min.size() + heap_max.size() == 0) heap_min.push_back(num);
         else {
             if(num > pre) {
                 heap_min.pop_back();
                 heap_min.push_back(num);
                 heap_max.push_back(pre);
             }
             else heap_max.push_back(num);
         }
     }
     else {
         if(num < heap_max[0]) insert_max(num);
         else insert_min(num);
     }
     int s = heap_max.size();
     int x = heap_min.size();
     if(abs(s-x) > 1) {
         if(heap_max.size() > heap_min.size()) {
             insert_min(heap_max[0]);
             swap(heap_max[0], heap_max[heap_max.size()-1]);
             heap_max.pop_back();
             int i = 0;
             while(true) {
                 int left = i*2 + 1, right = i*2 + 2;
                 int maxn = heap_max[i], index = -1;
                 if(left < heap_max.size() && heap_max[left] > maxn) maxn = heap_max[left], index = left;
                 if(right < heap_max.size() && heap_max[right] > maxn) maxn = heap_max[right], index = right;
                 if(maxn == heap_max[i]) break;
                 swap(heap_max[index], heap_max[i]);
                 i = index;
             }
         }
         else {
             insert_max(heap_min[0]);
             swap(heap_min[0], heap_min[heap_min.size()-1]);
             heap_min.pop_back();
             int i = 0;
             while(true) {
                 int left = i*2 + 1, right = i*2 + 2;
                 int minn = heap_min[i], index = -1;
                 if(left < heap_min.size() && heap_min[left] < minn) minn = heap_min[left], index = left;
                 if(right < heap_min.size() && heap_min[right] < minn) minn = heap_min[right], index = right;
                 if(minn == heap_min[i]) break;
                 swap(heap_min[index], heap_min[i]);
                 i = index;
             }
         }
     }   
     pre = num;
 }