Cod sursa(job #2567033)

Utilizator memecoinMeme Coin memecoin Data 3 martie 2020 14:37:18
Problema Orase Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <iomanip>
#include <string>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <math.h>
#include <set>
#include <map>
#include <string.h>
#include <queue>
#include <stack>

#define INF 0x3f3f3f3f

using namespace std;

#ifdef DEBUG
string name = "data";
#else
string name = "orase";
#endif

ifstream fin(name + ".in");
ofstream fout(name + ".out");

int m, n;

struct Street {
    int start;
    int length;
    int index;
};

vector<Street> streets;

bool compareStreet(Street &s1, Street &s2) {
    return s1.start < s2.start;
}

int main() {
    
    fin >> m >> n;
    
    for (int i = 0; i < n; ++i) {
        int x, y;
        fin >> x >> y;
        streets.push_back({x, y, 0});
    }
    
    sort(streets.begin(), streets.end(), compareStreet);
    
    for (int i = 0; i < n; ++i) {
        streets[i].index = i;
    }
    
    auto compare = [](Street lhs, Street rhs) {
        return (lhs.length + lhs.start) < (rhs.length + rhs.start);
    };
    
    priority_queue<Street, vector<Street>, decltype(compare)> pq(compare);
    
    for (int i = 0; i < n; ++i) {
        pq.push(streets[i]);
    }
    
    int best = 0;
    
    for (int i = 0; i < n - 1; ++i) {
        int offset = streets[i].start;
        int startSum = streets[i].length;
        
        while (pq.top().index <= i) {
            pq.pop();
        }
        
        auto x = pq.top();
        
        int candidate = startSum + (x.start - offset) + x.length;
        
        if (candidate > best) {
            best = candidate;
        }
        
    }
    
    fout << best;
    
    return 0;
}