Cod sursa(job #2690848)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 26 decembrie 2020 11:07:48
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.45 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <queue>

using namespace std;

ifstream fin("dlboss.in");
ofstream fout("dlboss.out");

int nr_elem, heap[100005], rasp[100005];
long long s;

priority_queue <int> prio_q;

struct maxibaw{
    int frm, timp, ord;
}tipe[100005];

void citire(int n)
{
    for(int i=1; i<=n; i++)
    {
        fin>>tipe[i].timp>>tipe[i].frm;
        tipe[i].ord=i;
    }
}

bool cmp(maxibaw a, maxibaw b)
{
    if(a.frm < b.frm)
        return true;
    if(a.frm == b.frm)
    {
        if(a.timp < b.timp)
            return true;
        else
            return false;
    }
    if(a.frm > b.frm)
        return false;
}

void insertHeap(int nr)
{
    nr_elem++;
    heap[nr_elem]=nr;
    int poz=nr_elem;
    while(heap[poz] > heap[poz/2] && poz>=2)
    {
        swap(heap[poz], heap[poz/2]);
        poz/=2;
    }
}

void popHeap()
{
    heap[1]=heap[nr_elem];
    nr_elem--;
    int poz=1;
    while(poz*2 <=nr_elem &&(heap[poz] < heap[poz*2] || heap[poz] < heap[poz*2+1]))
    {
        if(poz*2+1 > nr_elem || heap[poz*2] >= heap[poz*2+1])
        {
            swap(heap[poz], heap[poz*2]);
            poz=poz*2;
        }
        else
        {
            swap(heap[poz], heap[poz*2+1]);
            poz=poz*2+1;
        }
    }
}

int topHeap()
{
    return heap[1];
}

int main()
{
    int nr_tipe, t_maxim, ans=0;
    fin>>nr_tipe>>t_maxim;
    citire(nr_tipe);
    sort(tipe, tipe + nr_tipe + 1, cmp);
    for(int i=nr_tipe-1; i>0; i--)
    {
        if(tipe[i].frm==tipe[i+1].frm)
        {
            rasp[tipe[i].ord]=ans;
            continue;
        }
        s=s+tipe[i+1].timp;
        ans++;
        if(s<=t_maxim)
        {
            // insertHeap(tipe[i+1].timp);
            prio_q.push(tipe[i+1].timp);
        }
        if(s>t_maxim)
        {
            if(tipe[i+1].timp > prio_q.top())
            {
                ans--;
                s=s-tipe[i+1].timp;
            }
            else
            {
                ans--;
                // s[i]=s[i]-topHeap();
                // popHeap();
                // insertHeap(tipe[i+1].timp);
                s=s-prio_q.top();
                prio_q.pop();
                prio_q.push(tipe[i+1].timp);
            }
        }
        rasp[tipe[i].ord]=ans;
    }
    for(int i=1; i<=nr_tipe; i++)
        fout<<rasp[i]<<'\n';
    return 0;
}