Cod sursa(job #2472050)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 11 octombrie 2019 22:45:34
Problema Amenzi Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.09 kb
#include <bits/stdc++.h>

using namespace std;

const int N = 150;
const int K = 12000 + 7;
const int P = 8000 + 7;
int n, m, k, p;
int d[N][N];

struct KEK
{
    int nod;
    int tmp;
    int val;
};

KEK a[K], b[P];
int when[K + P], all;

int id(int x)
{
    int l = 0, r = all - 1;
    while (l <= r)
    {
        int m = (l + r) / 2;
        if (when[m] == x)
        {
            return m;
        }
        if (when[m] < x)
        {
            l = m + 1;
        }
        else
        {
            r = m - 1;
        }
    }
    return -1;
}

int urm(int x)
{
    int l = 0, r = all - 1, ans = -1;
    while (l <= r)
    {
        int m = (l + r) / 2;
        if (when[m] >= x)
        {
            ans = m;
            r = m - 1;
        }
        else
        {
            l = m + 1;
        }
    }
    return ans;
}

int dp[N][K + P];

bool cmp(KEK a, KEK b)
{
    if (a.tmp == b.tmp)
    {
        return a.nod < b.nod;
    }
    else
    {
        return a.tmp < b.tmp;
    }
}

int main()
{
    freopen ("amenzi.in", "r", stdin);
    freopen ("amenzi.out", "w", stdout);

    cin >> n >> m >> k >> p;

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            d[i][j] = (int) 1e9;
        }
    }

    for (int i = 0; i < m; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        a--;
        b--;
        d[a][b] = d[b][a] = c;
    }

    for (int k = 0; k < n; k++)
    {
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
            }
        }
    }

    set <int> tms;
    for (int i = 0; i < k; i++)
    {
        cin >> a[i].nod >> a[i].tmp >> a[i].val;
        a[i].nod--;
        tms.insert(a[i].tmp);
    }
    sort(a, a + k, cmp);
    int cur = 0;

    for (int i = 0; i < p; i++)
    {
        cin >> b[i].nod >> b[i].tmp;
        b[i].nod--;
        tms.insert(b[i].tmp);
    }

    tms.insert(0);
    tms.insert((int) 1e9);
    for (auto &it : tms)
    {
        when[all++] = it;
    }

    for (int j = 0; j < all; j++)
    {
        for (int i = 0; i < n; i++)
        {
            dp[i][j] = - (int) 1e9;
        }
    }

    dp[0][0] = 0;

    for (int j = 0; j < all; j++)
    {
        int t = when[j];
        for (int i = 0; i < n; i++)
        {
            while (cur < k && a[cur].nod == i && a[cur].tmp == t)
            {
                dp[i][j] += a[cur].val;
                cur++;
            }
            if (j > 0)
            {

                dp[i][j] = max(dp[i][j], dp[i][j - 1]);
            }
            for (int b = 0; b < n; b++)
            {
                int j2 = urm(t + d[i][b]);
                if (j2 != -1)
                {
                    dp[b][j2] = max(dp[b][j2], dp[i][j]);
                }
            }
        }
    }


    for (int i = 0; i < p; i++)
    {
        cout << dp[b[i].nod][id(b[i].tmp)] << "\n";
    }


    return 0;
}