Submission #1163663

#TimeUsernameProblemLanguageResultExecution timeMemory
1163663dnnndaBoard Game (JOI24_boardgame)C++20
0 / 100
438 ms45888 KiB
#include<bits/stdc++.h>
using namespace std;
#define S second
#define F first
#define ll long long
//#define int long long
//#pragma GCC optimize("Ofast, unroll-loop")
//#pragma GCC target("avx,avx2")
//#pragma GCC optimize("O3")
#define init(arr,val) memset(arr,val,sizeof arr)
const int inf=0x3f3f3f3f;
const ll inff=0x3f3f3f3f3f3f3f3f;
const int X=1000000007;
//const int X=998244353;

vector<int> adj[50004];
int x[50004], st[50004], d[3003][3003];
bool vis[3003][3003];
ll cost[50003];

int main(){
    //ios::sync_with_stdio(false), cin.tie(nullptr);
    int n, m, k; cin >> n >> m >> k;
    for(int i=1 ; i<=m ; i++){
        int u, v; cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    string s; cin >> s;
    s="."+s;
    for(int i=1 ; i<=k ; i++) cin >> x[i];

    for(int i=1 ; i<=n ; i++){
        if(s[i]=='0') continue;
        st[i]=1;
        for(int v:adj[i]) if(s[v]=='1') st[i]=2;
    }
    //for(int i=1 ; i<=n ; i++) cout << st[i] << ' ';
    //cout << '\n';
    for(int i=2 ; i<=k ; i++){
        int dis1=inf, dis2=inf;
        queue<int> q;
        q.push(x[i]);
        bitset<3003> _vis;
        _vis.reset();
        vector<int> _d(3003,inf);
        _d[x[i]]=0;
        _vis[x[i]]=1;
        while(!q.empty()){
            int u=q.front();
            q.pop();
            if(st[u]==1) dis1=min(dis1,_d[u]);
            if(st[u]==2) dis2=min(dis2,_d[u]);
            for(int v:adj[u]) if(!_vis[v]){
                _vis[v]=1;
                _d[v]=_d[u]+1;
                q.push(v);
            }
        }

        //cout << i << ' ' << dis1 << ' ' << dis2 << '\n';

        cost[1]+=min(dis1==0 ? 2 : dis1,dis2==0 ? 1 : dis2);
        for(int j=2 ; j<=n ; j++){
            cost[j]+=min((dis1==0 ? 2 : dis1)+2*(j-1),(dis2==0 ? 1 : dis2)+(j-1));
        }
    }
    //for(int i=1 ; i<=n ; i++) cout << cost[i] << ' ';
    //cout << '\n';

    queue<pair<int,int>> q;
    init(vis,0);
    q.push({x[1],0});
    vis[x[1]][0]=1;
    init(d,0x3f);
    d[x[1]][0]=0;

    while(!q.empty()){
        auto[u,t]=q.front();
        //cout << u << ' ' << t << '\n';
        q.pop();
        for(int v:adj[u]){
            if(u==x[1]&&t==0||s[u]=='0'){
                if(!vis[v][t]){
                    vis[v][t]=1;
                    d[v][t]=d[u][t]+1;
                    q.push({v,t});
                }
            }
            else{
                if(t+1<=n&&!vis[v][t+1]){
                    vis[v][t+1]=1;
                    d[v][t+1]=d[u][t]+1;
                    q.push({v,t+1});
                }
            }
        }
    }

    for(int i=1 ; i<=n ; i++){
        ll ans=inff;
        for(int c=0 ; c<=n ; c++) ans=min(ans,d[i][c]+cost[c]);
        cout << 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...