Submission #1160482

#TimeUsernameProblemLanguageResultExecution timeMemory
1160482sofija6Voting Cities (NOI22_votingcity)C++20
100 / 100
81 ms8888 KiB
#include <bits/stdc++.h>
#define ll long long
#define MAXN 5010
#define llinf 1e17
using namespace std;
ll n,k,t[MAXN],p[10];
vector<pair<ll,ll> > G[MAXN];
ll dist[MAXN][50];
void Dijkstra()
{
    for (ll i=1;i<=n;i++)
    {
        for (ll j=0;j<(1<<5);j++)
            dist[i][j]=llinf;
    }
    priority_queue<pair<ll,pair<ll,ll> >,vector<pair<ll,pair<ll,ll> > >,greater<pair<ll,pair<ll,ll> > > > q;
    for (ll i=1;i<=k;i++)
    {
        dist[t[i]][0]=0;
        q.push({0,{t[i],0}});
    }
    while (!q.empty())
    {
        ll cur=q.top().first,i=q.top().second.first,j=q.top().second.second;
        q.pop();
        if (dist[i][j]!=cur)
            continue;
        for (auto next : G[i])
        {
            if (dist[next.first][j]>cur+next.second)
            {
                dist[next.first][j]=cur+next.second;
                q.push({dist[next.first][j],{next.first,j}});
            }
            for (ll l=0;l<5;l++)
            {
                if (((1<<l)&j))
                    continue;
                if (dist[next.first][j|(1<<l)]>cur+next.second*(9-l)/10)
                {
                    dist[next.first][j|(1<<l)]=cur+next.second*(9-l)/10;
                    q.push({dist[next.first][j|(1<<l)],{next.first,j|(1<<l)}});
                }
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    ll e,u,v,c,q,s;
    cin >> n >> e >> k;
    for (ll i=1;i<=k;i++)
    {
        cin >> t[i];
        t[i]++;
    }
    for (ll i=1;i<=e;i++)
    {
        cin >> u >> v >> c;
        u++;
        v++;
        G[v].push_back({u,c});
    }
    Dijkstra();
    cin >> q;
    while (q--)
    {
        cin >> s;
        s++;
        for (ll i=0;i<5;i++)
            cin >> p[i];
        ll ans=llinf;
        for (ll i=0;i<(1<<5);i++)
        {
            ll price=0;
            bool ok=true;
            for (ll j=0;j<5;j++)
            {
                if (((1<<j)&i) && p[j]==-1)
                {
                    ok=false;
                    break;
                }
                if (((1<<j)&i))
                    price+=p[j];
            }
            if (!ok)
                continue;
            ans=min(ans,dist[s][i]+price);
        }
        cout << (ans==llinf?-1 : ans) << "\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...