Submission #675059

# Submission time Handle Problem Language Result Execution time Memory
675059 2022-12-27T01:28:49 Z vjudge1 Portals (BOI14_portals) C++17
100 / 100
513 ms 157196 KB
/*
    I find it wholesome to be alone the greater part of the time.
    To be in company, even with the best, is soon wearisome and dissipating.
    I love to be alone.
    I never found the companion that was so companionable as solitude.
*/
#include <bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define faster ios_base::sync_with_stdio(0); cin.tie(0);
 
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair <int, int>;
mt19937_64 Rand(chrono::steady_clock::now().time_since_epoch().count());
const int maxN = 1000 + 10;
//const int Mod = 1e9 + 7;
//const int inf =
int n, m;
int dx[] = {0, 0, -1, 1};
int dy[] = {-1, 1, 0, 0};
int far[maxN][maxN][4];
string s[maxN];
int ans[maxN][maxN];
 
struct TNode{
    int fi, se, w;
    bool operator < (const TNode &other) const{
        return w > other.w;
    }
};
 
vector <TNode> adj[maxN][maxN];
void Dijkstra(pii u, pii v){
    priority_queue <TNode> PQ;
    PQ.push({u.fi, u.se, 0});
    memset(ans, 0x3f, sizeof(ans));
    ans[u.fi][u.se] = 0;
    while (!PQ.empty()){
        auto r = PQ.top(); PQ.pop();
        if (ans[r.fi][r.se] != r.w) continue;
        for (auto i: adj[r.fi][r.se]){
            if (ans[i.fi][i.se] > ans[r.fi][r.se] + i.w){
                ans[i.fi][i.se] = ans[r.fi][r.se] + i.w;
                PQ.push({i.fi, i.se, ans[i.fi][i.se]});
            }
        }
    }
}
 
void Solve(int d){
    if (d & 1){
        for (int i = 1; i <= n; ++i){
            for (int j = 1; j <= m; ++j){
                if (s[i][j] == '#'){
                    far[i][j][d] = -1;
                    continue;
                }
                far[i][j][d] = far[i - dx[d]][j - dy[d]][d] + 1;
            }
        }
    }
    else{
        for (int i = n; i >= 1; --i){
            for (int j = m; j >= 1; --j){
                if (s[i][j] == '#'){
                    far[i][j][d] = -1;
                    continue;
                }
                far[i][j][d] = far[i - dx[d]][j - dy[d]][d] + 1;
            }
        }
    }
}
 
void Init(){
    cin >> n >> m;
    for (int i = 0; i < m + 2; ++i) s[0].pb('#');
    for (int i = 0; i < m + 2; ++i) s[n + 1].pb('#');
    pii u, v;
    for (int i = 1; i <= n; ++i){
        cin >> s[i];
        s[i] = "#" + s[i] + "#";
        for (int j = 1; j <= m; ++j){
            if (s[i][j] == 'S') u = {i, j};
            else if (s[i][j] == 'C') v = {i, j};
        }
    }
    memset(far, -1, sizeof(far));
    for (int i = 0; i < 4; ++i)
        Solve(i);
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= m; ++j){
            pii minn = {0x3f3f3f3f, 0};
            for (int d = 0; d < 4; ++d){
                minn = min(minn, {far[i][j][d], d});
                if (s[i + dx[d]][j + dy[d]] != '#'){
                    adj[i][j].pb({i + dx[d], j + dy[d], 1});
                }
            }
            for (int d = 0; d < 4; ++d){
                if (far[i][j][d] == minn.fi) continue;
                int dist = minn.fi + 1;
                assert(dist > 0);
                adj[i][j].pb({i - far[i][j][d] * dx[d], j - far[i][j][d] * dy[d], dist});
            }
        }
    }
    Dijkstra(u, v);
    cout << ans[v.fi][v.se];
}
 
#define debug
#define taskname "test"
signed main(){
    faster
    if (fopen(taskname".inp", "r")){
        freopen(taskname".inp", "r", stdin);
        freopen(taskname".out", "w", stdout);
    }
    int tt = 1;
    //cin >> tt;
    while (tt--){
        Init();
    }
    if (fopen("timeout.txt", "r")){
        ofstream timeout("timeout.txt");
        timeout << signed(double(clock()) / CLOCKS_PER_SEC * 1000);
        timeout.close();
        #ifndef debug
        cerr << "Time elapsed: " << signed(double(clock()) / CLOCKS_PER_SEC * 1000) << "ms\n";
        #endif // debug
    }
}

Compilation message

portals.cpp: In function 'int main()':
portals.cpp:120:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  120 |         freopen(taskname".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
portals.cpp:121:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  121 |         freopen(taskname".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 22 ms 44156 KB Output is correct
2 Correct 23 ms 44208 KB Output is correct
3 Correct 22 ms 44168 KB Output is correct
4 Correct 26 ms 44288 KB Output is correct
5 Correct 22 ms 44236 KB Output is correct
6 Correct 21 ms 44240 KB Output is correct
7 Correct 21 ms 44160 KB Output is correct
8 Correct 26 ms 44192 KB Output is correct
9 Correct 23 ms 44288 KB Output is correct
10 Correct 21 ms 44192 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 23 ms 44276 KB Output is correct
2 Correct 21 ms 44228 KB Output is correct
3 Correct 21 ms 44244 KB Output is correct
4 Correct 25 ms 44280 KB Output is correct
5 Correct 24 ms 44244 KB Output is correct
6 Correct 22 ms 44264 KB Output is correct
7 Correct 22 ms 44244 KB Output is correct
8 Correct 22 ms 44232 KB Output is correct
9 Correct 23 ms 44500 KB Output is correct
10 Correct 25 ms 44572 KB Output is correct
11 Correct 23 ms 44356 KB Output is correct
12 Correct 23 ms 44368 KB Output is correct
13 Correct 22 ms 44372 KB Output is correct
14 Correct 22 ms 44164 KB Output is correct
15 Correct 21 ms 44372 KB Output is correct
16 Correct 23 ms 44244 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 24 ms 44264 KB Output is correct
2 Correct 20 ms 44168 KB Output is correct
3 Correct 25 ms 44188 KB Output is correct
4 Correct 21 ms 44244 KB Output is correct
5 Correct 31 ms 46632 KB Output is correct
6 Correct 31 ms 46896 KB Output is correct
7 Correct 33 ms 47248 KB Output is correct
8 Correct 30 ms 46832 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 20 ms 44264 KB Output is correct
2 Correct 21 ms 44328 KB Output is correct
3 Correct 21 ms 44244 KB Output is correct
4 Correct 22 ms 44252 KB Output is correct
5 Correct 21 ms 44248 KB Output is correct
6 Correct 20 ms 44244 KB Output is correct
7 Correct 21 ms 44244 KB Output is correct
8 Correct 21 ms 44244 KB Output is correct
9 Correct 22 ms 44500 KB Output is correct
10 Correct 24 ms 44552 KB Output is correct
11 Correct 22 ms 44372 KB Output is correct
12 Correct 22 ms 44500 KB Output is correct
13 Correct 25 ms 44420 KB Output is correct
14 Correct 33 ms 46712 KB Output is correct
15 Correct 32 ms 46796 KB Output is correct
16 Correct 37 ms 47220 KB Output is correct
17 Correct 36 ms 47228 KB Output is correct
18 Correct 34 ms 47892 KB Output is correct
19 Correct 33 ms 48764 KB Output is correct
20 Correct 34 ms 48792 KB Output is correct
21 Correct 30 ms 46668 KB Output is correct
22 Correct 31 ms 46768 KB Output is correct
23 Correct 34 ms 47052 KB Output is correct
24 Correct 34 ms 48656 KB Output is correct
25 Correct 21 ms 44180 KB Output is correct
26 Correct 24 ms 44444 KB Output is correct
27 Correct 22 ms 44192 KB Output is correct
28 Correct 29 ms 46844 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 20 ms 44168 KB Output is correct
2 Correct 20 ms 44244 KB Output is correct
3 Correct 23 ms 44168 KB Output is correct
4 Correct 21 ms 44256 KB Output is correct
5 Correct 21 ms 44288 KB Output is correct
6 Correct 22 ms 44256 KB Output is correct
7 Correct 25 ms 44168 KB Output is correct
8 Correct 21 ms 44172 KB Output is correct
9 Correct 25 ms 44500 KB Output is correct
10 Correct 22 ms 44500 KB Output is correct
11 Correct 23 ms 44388 KB Output is correct
12 Correct 22 ms 44372 KB Output is correct
13 Correct 23 ms 44456 KB Output is correct
14 Correct 30 ms 46604 KB Output is correct
15 Correct 36 ms 46908 KB Output is correct
16 Correct 34 ms 47308 KB Output is correct
17 Correct 35 ms 47180 KB Output is correct
18 Correct 35 ms 47868 KB Output is correct
19 Correct 35 ms 48900 KB Output is correct
20 Correct 34 ms 48724 KB Output is correct
21 Correct 30 ms 46748 KB Output is correct
22 Correct 33 ms 46676 KB Output is correct
23 Correct 34 ms 46880 KB Output is correct
24 Correct 348 ms 125040 KB Output is correct
25 Correct 513 ms 157196 KB Output is correct
26 Correct 418 ms 156972 KB Output is correct
27 Correct 425 ms 156900 KB Output is correct
28 Correct 298 ms 105296 KB Output is correct
29 Correct 307 ms 106484 KB Output is correct
30 Correct 336 ms 108612 KB Output is correct
31 Correct 33 ms 48656 KB Output is correct
32 Correct 418 ms 156672 KB Output is correct
33 Correct 21 ms 44244 KB Output is correct
34 Correct 22 ms 44420 KB Output is correct
35 Correct 331 ms 125516 KB Output is correct
36 Correct 21 ms 44236 KB Output is correct
37 Correct 29 ms 46796 KB Output is correct
38 Correct 232 ms 109932 KB Output is correct
39 Correct 230 ms 94268 KB Output is correct