Cod sursa(job #2918360)

Utilizator Iordache_CezarIordache Cezar Iordache_Cezar Data 11 august 2022 11:53:51
Problema Amenzi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <bits/stdc++.h>
#define NMAX 158
#define TMAX 3508
#define KMAX 12008
#define PMAX 8008

using namespace std;
ifstream fin ("amenzi.in");
ofstream fout ("amenzi.out");

int n, m, k, p;
int amenda[TMAX][NMAX], lgs[KMAX], dp[TMAX][NMAX], sol[PMAX];
vector < pair <int, int> > G[NMAX];
vector < pair <int, int> > sotie[NMAX];

int main()
{
    int a, b, c;
    fin >> n >> m >> k >> p;
    for (int i = 1; i <= m; i++)
    {
        fin >> a >> b >> c;
        G[a].push_back({b, c});
        G[b].push_back({a, c});
    }

    for (int i = 1; i <= k; i++)
    {
        fin >> a >> b >> c;
        amenda[b][a] += c;
    }

    for (int i = 1; i <= p; i++)
    {
        fin >> a >> b;
        sotie[a].push_back({b, i});
    }
    for (int i = 1; i <= n; i++)
        sort(sotie[i].begin(), sotie[i].end());

    for (int t = 0; t <= 3500; t++)
        for (int i = 1; i <= n; i++)
            dp[t][i] = -1e9;
    dp[0][1] = amenda[0][1];
    for (int t = 1; t <= 3500; t++)
        for (int i = 1; i <= n; i++)
        {
            int val = dp[t-1][i];
            for (auto vecin : G[i])
                if (t - vecin.second >= 0)
                    val = max(val, dp[t-vecin.second][vecin.first]);
            if (val >= 0)
            {
                val += amenda[t][i];
                dp[t][i] = val;
            }

            while (lgs[i] < sotie[i].size() && sotie[i][lgs[i]].first == t) ///intersectie cu sotia
            {
                sol[sotie[i][lgs[i]].second] = dp[t][i];
                lgs[i]++;
            }
        }

    for (int i = 1; i <= p; i++)
    {
        if (sol[i] == -1e9)
            sol[i] = -1;
        fout << sol[i] << '\n';
    }
    return 0;
}