Submission #1366434

#TimeUsernameProblemLanguageResultExecution timeMemory
1366434phtungMaze (JOI23_ho_t3)C++20
8 / 100
243 ms38452 KiB
#include <bits/stdc++.h>

using namespace std;

#define name "IO"
#define int long long

const int inf = 1e18 + 7;
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
int r, c, n, sr, sc, gr, gc;
vector<vector<char>> a;
vector<vector<bool>> rs, rg;

int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};

namespace subtask1
{
    void solve()
    {
        priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<>> pq;
        pq.push({0, {sr, sc}}); 
        vector<vector<int>> dist(r + 1, vector<int>(c + 1, inf));
        dist[sr][sc] = 0;

        while(!pq.empty())
        {
            auto [d, cur] = pq.top();
            pq.pop(); 
            auto [x, y] = cur; 
            if(d > dist[x][y]) continue;

            for(int i = 0; i < 4; i++)
            {
                int tx = x + dx[i];
                int ty = y + dy[i];

                if(tx < 1 || tx > r) continue;
                if(ty < 1 || ty > c) continue;
                int cur = d; 
                if(a[tx][ty] == '#') cur++; 
                if(dist[tx][ty] <= cur) continue;

                dist[tx][ty] = cur; 
                pq.push({cur, {tx, ty}});
            }
        }

        cout << dist[gr][gc] << "\n";
    }   
}

namespace subtask4
{
    void solve()
    {
        vector<vector<int>> dist(r + 1, vector<int>(c + 1, inf)); 
        dist[sr][sc] = 0;
        priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<>> q;
        q.push({0, {sr, sc}});

        while(!q.empty())
        {
            auto [d, pos] = q.top();
            q.pop();
            auto [x, y] = pos; 

            if(d > dist[x][y]) continue;
            
            vector<pair<int, int>> black; 

            for(int i = 0; i < 4; i++)
            {
                int tx = x + dx[i];
                int ty = y + dy[i];

                if(tx < 1 || tx > r) continue;
                if(ty < 1 || ty > c) continue;

                if(a[tx][ty] == '.' && d < dist[tx][ty])
                {
                    dist[tx][ty] = d; 
                    q.push({dist[tx][ty], {tx, ty}});
                }

                if(a[tx][ty] == '#') black.push_back({tx, ty});
            }

            for(auto [u, v] : black)
            {
                if(dist[u][v] > d + 1)
                {
                    dist[u][v] = d + 1;
                    q.push({dist[u][v], {u, v}}); 

                    int x1 = max(1ll , u - n + 1), y1 = max(1ll, v - n + 1);
                    int x2 = min(r, u + n - 1), y2 = min(c, v + n - 1);

                    for(int i = x1; i <= x2; i++)
                    {
                        for(int j = y1; j <= y2; j++)
                        {
                            if(dist[i][j] > dist[u][v])
                            {
                                dist[i][j] = dist[u][v]; 
                                q.push({dist[i][j], {i, j}});
                            }
                        }
                    }
                }
            }
        }

        cout << dist[gr][gc] << "\n";
    }   
}

void solve()
{
    cin >> r >> c >> n >> sr >> sc >> gr >> gc;
    a.resize(r + 1, vector<char>(c + 1));

    for(int i = 1; i <= r; i++)
    {
        for(int j = 1; j <= c; j++) cin >> a[i][j];
    }
    
    if(n == 1)
    {
        subtask1::solve();   
        return;
    }

    // if(r * c <= 60000)
    // {
    //     subtask4::solve();
    //     return;
    // }

    subtask4::solve();
}

signed main()
{
    if(fopen(name".INP","r"))
    {
        freopen(name".INP","r",stdin);
        // freopen(name".OUT","w",stdout);
    }


    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    clock_t start = clock();

    int t = 1;

    while(t--) solve();

    std::cerr << "Time: " << clock() - start << "ms\n";

    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:148:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  148 |         freopen(name".INP","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...