제출 #1127751

#제출 시각아이디문제언어결과실행 시간메모리
1127751VMaksimoski008K번째 경로 (IZhO11_kthpath)C++20
100 / 100
1 ms328 KiB
#include <bits/stdc++.h>
#define ar array
//#define int long long

using namespace std;

using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

const int mod = 1e9 + 7;
const int LOG = 20;
const int maxn = 1e5 + 5;

vector<pii> G[35][35];
ll dp[35][35];
int bad[35][35];

signed main() {
    int n, m; cin >> n >> m;
    string ans = "";

    char mat[n+1][m+1];
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++) cin >> mat[i][j];
    
    ll K; cin >> K;
    ans += mat[1][1];
    for(int it=2; it<=n+m-1; it++) {
        int l=0, r=25, pos=25;
        while(l <= r) {
            int mid = (l + r) / 2;
            for(int i=1; i<=n; i++)
                for(int j=1; j<=m; j++) dp[i][j] = 0;

            dp[1][1] = 1;
            for(int i=1; i<=n; i++) {
                for(int j=1; j<=m; j++) {
                    if(bad[i][j]) continue;
                    if(i + j - 2 == it - 1 && mat[i][j] - 'a' > mid) continue;
                    dp[i][j] += dp[i-1][j] + dp[i][j-1];
                }
            }

            if(dp[n][m] >= K) pos = mid, r = mid - 1;
            else l = mid + 1;
        }

        if(pos) {
            for(int i=1; i<=n; i++)
                for(int j=1; j<=m; j++) dp[i][j] = 0;
            dp[1][1] = 1;

            for(int i=1; i<=n; i++) {
                for(int j=1; j<=m; j++) {
                    if(bad[i][j]) continue;
                    if(i + j - 2 == it - 1 && mat[i][j] - 'a' > pos - 1) continue;
                    dp[i][j] += dp[i-1][j] + dp[i][j-1];
                }
            }

            K -= dp[n][m];
        }

        char ch = 'a' + pos;
        ans += ch;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
                if(i + j - 2 == it - 1 && mat[i][j] != ch) bad[i][j] = 1;
    }

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