Cod sursa(job #2918347)

Utilizator anastasei_tudorAnastasei Tudor anastasei_tudor Data 11 august 2022 11:31:27
Problema Amenzi Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 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++)
        {
            /*if (!timp[i].empty() && timp[i][lg[i]] == t) ///intersectie cu amenda
            {
                dp[t][i] = dp[t-1][i];
                int val = 0;
                for (auto vecin : G[i])
                    val = max(val, dp[t-vecin.second][vecin.first]);
                val += amenda[t][i];
                dp[t][i] = max(dp[t][i], val);
                lg[i]++;
            }*/
            //else
            //{
                int val = -1e9;
                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] = max(dp[t-1][i], val);
                }
            //}

            if (!sotie[i].empty() && 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++)
            fout << sol[i] << '\n';
    return 0;
}