Submission #1303797

#TimeUsernameProblemLanguageResultExecution timeMemory
1303797domiK번째 경로 (IZhO11_kthpath)C++20
100 / 100
3 ms580 KiB
#include <bits/stdc++.h>

#define int long long
#define fi first
#define se second

#define sz(a) (int)((a).size())
#define all(a) (a).begin(), (a).end()

#define lsb(x) (x & (-x))
#define vi vector<int>
#define YES { cout << "Yes" << endl; return; }
#define NO { cout << "No" << endl; return; }

using ll = long long;
using pii = std::pair<int, int>;

const int NMAX = 30;

using namespace std;

char a[NMAX + 5][NMAX + 5];
int dp[NMAX + 5][NMAX + 5][2], n, m, k;

int solve(string& sol) {
    fill(&dp[0][0][0], &dp[0][0][0] + (NMAX + 5) * (NMAX + 5) * 2, 0LL);

    dp[1][1][0] = 1;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            for (int lower = 0; lower < 2; ++lower) {
                if (i + 1 <= n) {
                    int new_lower = (lower | (a[i + 1][j] < sol[i + j - 1]));
                    if (!(new_lower == 0 && a[i + 1][j] > sol[i + j - 1]))
                        dp[i + 1][j][new_lower] += dp[i][j][lower];
                }

                if (j + 1 <= m) {
                    int new_lower = (lower | (a[i][j + 1] < sol[i + j - 1]));
                    if (!(new_lower == 0 && a[i][j + 1] > sol[i + j - 1]))
                        dp[i][j + 1][new_lower] += dp[i][j][lower];
                }
            }
        }
    }

    return dp[n][m][0] + dp[n][m][1];
}

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> n >> m;

    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            cin >> a[i][j];

    cin >> k;
    string ans(n + m - 1, 'z');
    ans[0] = a[1][1];
    for (int i = 2; i <= n + m - 1; ++i) {
        int lo = 0, hi = 25, best = 0;

        while (lo <= hi) {
            auto mid = (lo + hi) >> 1;
            ans[i - 1] = static_cast<char>(mid + 'a');

            if (solve(ans) >= k) {
                best = mid;
                hi = mid - 1;
            }
            else
                lo = mid + 1;
        }

        ans[i - 1] = static_cast<char>(best + 'a');
    }

    cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...