Cod sursa(job #2690748)

Utilizator dragos231456Neghina Dragos dragos231456 Data 25 decembrie 2020 16:58:31
Problema Amenzi Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <bits/stdc++.h>

using namespace std;

const int N=155;
const int M=3505;
const int inf=(1<<30)-1;

ifstream f("amenzi.in");
ofstream g("amenzi.out");

int n,m,k,p;
int d,b,c;
int dist[N][N];

struct Infractiune{
    int city,time,value;
}a[4*M],x;

vector<Infractiune>dp[N];

void RoyFloyd() {
    for(int i=1;i<=n;++i) {
        for(int j=1;j<=n;++j) {
            for(int k=1;k<=n;++k) {
                dist[i][j] = min(dist[i][j],dist[i][k]+dist[k][j]);
            }
        }
    }
}

bool comp(Infractiune A,Infractiune B) {
    return (A.time < B.time);
}

int getMaxLast(Infractiune a,bool ok) {
    int mx = -1;
    int lt,rt,md,dt;
    for(int i=1;i<=n;++i) {
        lt=-1;
        rt = dp[i].size();
        dt = dist[a.city][i];
        while(rt - lt != 1) {
            md = (lt+rt)/2;
            if(dp[i][md].time + dt <= a.time) lt = md;
            else rt = md;
        }
        if(lt >= 0) mx = max(mx,dp[i][lt].value);
    }
    if(mx >= 0 && ok) {
        a.value+=mx;
        dp[a.city].push_back(a);
    }
    if(mx < 0) mx = 0;
    return mx;
}

int main()
{
    for(int i=1;i<=N-5;++i) for(int j=1;j<=N-5;++j) if(i!=j) dist[i][j]=inf;
    x.city = 1; x.time =0; x.value = 0;
    dp[1].push_back(x);

    f>>n>>m>>k>>p;
    for(int i=1;i<=m;++i) {
        f>>d>>b>>c;
        dist[d][b]=dist[b][d]=c;
    }

    RoyFloyd();

//    for(int i=1;i<=5;++i, cout<<endl) for(int j=1;j<=5;++j) cout<<dist[i][j]<<' ';
//    cout<<endl<<endl;

    for(int i=1;i<=k;++i) f>>a[i].city>>a[i].time>>a[i].value;
    sort(a+1,a+k+1,comp);
    for(int i=1;i<=k;++i) getMaxLast(a[i],1);

    for(int i=1;i<=p;++i) {
        f>>x.city>>x.time;
        g<<getMaxLast(x,0)<<'\n';
    }

//    for(int i=1;i<=n;++i) {
//        for(int j=0;j<dp[i].size();++j) {
//            cout<<dp[i][j].time<<' '<<dp[i][j].value<<endl;
//        }
//        cout<<endl;
//    }
    return 0;
}