Submission #948621

#TimeUsernameProblemLanguageResultExecution timeMemory
948621Darren0724Portals (BOI14_portals)C++17
100 / 100
512 ms81396 KiB
#include <bits/stdc++.h>
using namespace std;
#define LCBorz ios_base::sync_with_stdio(false); cin.tie(0);
//#define int long long
#define all(x) x.begin(), x.end()
#define endl '\n'
const int N=1005;
const int INF=1e9;
 
int32_t main() {
    LCBorz;
    int n,m;cin>>n>>m;
    vector<vector<char>> v(n+2,vector<char>(m+2,'#'));
    auto id=[&](int a,int b){
        return a*N+b;
    };
    auto valid=[&](int a,int b){
        return v[a][b]!='#';
    };
    auto rev=[&](int id){
        return make_pair(id/N,id%N);
    };
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>v[i][j];
        }
    }
    vector<int> adj[N*N];
    for(int i=1;i<=n;i++){
        int last=0;
        for(int j=1;j<=m;j++){
            if(!valid(i,j)){
                last=j;
                continue;
            }
            adj[id(i,j)].push_back(id(i,last+1));
        }
        last=m+1;
        for(int j=m;j>=1;j--){
            if(!valid(i,j)){
                last=j;
                continue;
            }
            adj[id(i,j)].push_back(id(i,last-1));
        }
    }
    for(int i=1;i<=m;i++){
        int last=0;
        for(int j=1;j<=n;j++){
            if(!valid(j,i)){
                last=j;
                continue;
            }
            adj[id(j,i)].push_back(id(last+1,i));
        }
        last=n+1;
        for(int j=n;j>=1;j--){
            if(!valid(j,i)){
                last=j;
                continue;
            }
            adj[id(j,i)].push_back(id(last-1,i));
        }
    }
    vector<int> dx={0,0,-1,1},dy={1,-1,0,0};
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(!valid(i,j))continue;
            for(int k=0;k<4;k++){
                int a=i+dx[k],b=j+dy[k];
                if(!valid(a,b))continue;
                adj[id(i,j)].push_back(id(a,b));
            }
        }
    }
    queue<int> q;
    vector<int> dis(N*N,INF);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(v[i][j-1]=='#'||v[i][j+1]=='#'||v[i-1][j]=='#'||v[i+1][j]=='#'){
                q.push(id(i,j));
                dis[id(i,j)]=0;
            }
        }
    }
    while(q.size()){
        int p=q.front();
        q.pop();
        for(int j:adj[p]){
            if(dis[j]==INF){
                dis[j]=dis[p]+1;
                q.push(j);
            }
        }
    }
    priority_queue<pair<int,int>> pq;
    vector dis1(N*N,INF);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(v[i][j]=='S'){
                dis1[id(i,j)]=0;
                pq.push({0,id(i,j)});
            }
        }
    }
    while(pq.size()){
        auto [dis2,t]=pq.top();
        pq.pop();
        dis2=-dis2;
        if(dis2!=dis1[t])continue;
        for(int j:adj[t]){
            int cost=dis1[t];
            if(abs(j-t)==N||abs(j-t)==1)cost+=1;
            else cost+=dis[t]+1;
            if(dis1[j]>cost){
                dis1[j]=cost;
                pq.push({-dis1[j],j});
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(v[i][j]=='C'){
                cout<<dis1[id(i,j)]<<endl;
            }
        }
    }
    
 
    
    return 0;
}

Compilation message (stderr)

portals.cpp: In function 'int32_t main()':
portals.cpp:20:10: warning: variable 'rev' set but not used [-Wunused-but-set-variable]
   20 |     auto rev=[&](int id){
      |          ^~~
#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...