제출 #1272389

#제출 시각아이디문제언어결과실행 시간메모리
1272389choedVoting Cities (NOI22_votingcity)C++20
0 / 100
4 ms1128 KiB
#include <bits/stdc++.h>
#define GO_BEYOND ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define ll long long
#define fi first
#define se second
#define pll pair<ll, ll>
#define plll pair<ll,pll>
using namespace std;

const ll MAXN=2000;
const ll MAXB=32;
vector<pll> edge[MAXN+1];
priority_queue<plll, vector<plll>, greater<plll>> pq;
vector<vector<ll>> mn(MAXN+1, vector<ll>(MAXB, INT_MAX));
vector<ll> sum(MAXN+1, 0LL);
multiset<ll> ms[MAXN+1]; // bilangan terbesar saat costnya min
vector<ll> disc; // diskon yang tersedia

void dijkstra(ll c, ll u, ll mask){
    if(c>mn[u][mask])
        return;

    // cout << u << ' ' << c << ' ' << mask << " CURRENT" << endl;
    
    ll tot, idx=0, BIT=__popcount(mask);
    for(auto x: edge[u]){
        tot=sum[u];
        ms[u].insert(x.se);
        idx=0;
        // cout << x.fi << ' ' << x.se << " EDGE" << endl;
        // cout << tot << " SUM" << endl;

        // cout << "HARGA ROAD" << endl;
        for(auto it=ms[u].rbegin(); it!=ms[u].rend(); it++){
            ll y = *it;
            // cout << y << ' ';
            if(idx<disc.size()){
                // cout << disc[idx];
                tot+=(y*disc[idx])/10;
                idx++;
            }else tot+=y;
            // cout << endl;
        }

        // cout << tot << " TOTAL" << endl;
        if(tot<mn[x.fi][mask]){
            mn[x.fi][mask]=tot;
            ms[x.fi]=ms[u];
            sum[x.fi]=sum[u];
            if(ms[x.fi].size()>BIT){
                sum[x.fi]+=*ms[x.fi].begin();
                ms[x.fi].erase(ms[x.fi].begin());
            }
            pq.push({tot, {x.fi, mask}});
        }

        ms[u].erase(ms[u].find(x.se));
    }
}

void solve(){
    ll n, e, k; cin >> n >> e >> k;
    ll t[k];
    for(int i=0; i<k; i++)
        cin >> t[i];
    
    ll u, v, c;
    for(int i=0; i<e; i++){
        cin >> u >> v >> c;
        edge[u].push_back({v,c});
        edge[v].push_back({u,c});
    }

    for(int i=0; i<MAXB; i++){
        for(int j=4; j>=0; j--){
            if((i&(1LL<<j))>0)
                disc.push_back(10-(j+1));
        }

        for(int j=0; j<k; j++){
            pq.push({0, {t[j], i}});
            mn[t[j]][i]=0;
        }
        
        while(!pq.empty()){
            c=pq.top().fi;
            u=pq.top().se.fi;
            v=pq.top().se.se;
            pq.pop();
            dijkstra(c, u, v);
        }

        while(!pq.empty())
            pq.pop();
        disc.clear();
        for(int i=0; i<=n; i++){
            sum[i]=0;
            ms[i].clear();
        }
    }

    ll q; cin >> q;
    while(q--){
        ll s, mask=0; cin >> s;
        vector<ll> price(5);
        for(int i=0; i<5; i++){
            cin >> price[i];
            if(price[i]!=-1)
                mask+=(1LL<<i);
        }
        
        ll ans=LLONG_MAX, cur;
        for(int i=0; i<MAXB; i++){
            if((i&mask)==i){
                cur=mn[s][i];
                for(int j=0; j<5; j++){
                    if(((1LL<<j)&i)>0)
                        cur+=price[j];
                }
                ans=min(ans, cur);
            }
            // cout << i << ' ' << cur << endl;
        }
        if(ans==INT_MAX)
            cout << -1;
        else cout << ans;
        cout << endl;
    }
}

/*
g++ sigma.cpp -o a
3 2 1
2
0 1 100
1 2 200
1
0 10 20 1000 2000 -1

2 0 1
1
1
0 -1 -1 -1 -1 -1

6 3 2
4 5
0 4 100
1 4 200
2 5 300
4
0 -1 -1 -1 -1 -1
1 20 40 10 100 4
2 1 2 3 4 0
3 0 -1 0 0 0
*/

int main(){
    GO_BEYOND;
    ll t=1;
    // cin >> t;
    while(t--) 
        solve();
}
#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...