結果
問題 | No.2855 Move on Grid |
ユーザー |
![]() |
提出日時 | 2024-08-25 16:20:13 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 619 ms / 3,000 ms |
コード長 | 2,624 bytes |
コンパイル時間 | 2,089 ms |
コンパイル使用メモリ | 204,960 KB |
最終ジャッジ日時 | 2025-02-24 01:51:15 |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 40 |
ソースコード
#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef long double ld;typedef pair<ll,ll> PP;// #define MOD 1000000007#define MOD 998244353#define INF 2305843009213693951//#define INF 810114514#define PI 3.141592653589#define setdouble setprecision#define REP(i,n) for(ll i=0;i<(n);++i)#define OREP(i,n) for(ll i=1;i<=(n);++i)#define RREP(i,n) for(ll i=(n)-1;i>=0;--i)#define ORREP(i,n) for(ll i=(n);i>=1;--i)#define rep(i,a,b) for(ll i=(a);i<=(b);++i)#define ALL(v) (v).begin(), (v).end()#define GOODBYE do { cout << "-1" << endl; return 0; } while (false)#define MM <<" "<<#define Endl endl#define debug true#define debug2 falseint main(void){//cin.tie(nullptr);//ios::sync_with_stdio(false);ll N,M,K;cin >> N >> M >> K;vector<vector<ll>> A(N,vector<ll>(M));REP(i,N){REP(j,M){cin >> A[i][j];}}vector<vector<ll>> dp(N,vector<ll>(M,INF));ll dy[4] = {0,1,0,-1};ll dx[4] = {1,0,-1,0};//スコア mid は達成可能か、すなわち mid 未満を通る回数を K 回に抑えられるかll ok = 1, ng = 1'000'000'001, mid;while(abs(ok-ng)>1){mid = (ok+ng)/2;REP(i,N){REP(j,M){dp[i][j]=INF;}}dp[0][0] = (A[0][0]<mid?1:0);priority_queue<pair<ll,pair<ll,ll>>,vector<pair<ll,pair<ll,ll>>>,greater<pair<ll,pair<ll,ll>>>> que;que.push({(A[0][0]<mid?1:0),{0,0}});while(!que.empty()){pair<ll,pair<ll,ll>> tt = que.top();que.pop();ll c = tt.first;ll i = tt.second.first, j = tt.second.second;// cout << "?? " << c MM i MM j << endl;REP(k,4){ll y = i+dy[k], x = j+dx[k];if(!(0<=y&&y<N&&0<=x&&x<M))continue;if(dp[y][x]>c+(A[y][x]<mid?1:0)){dp[y][x] = c+(A[y][x]<mid?1:0);que.push({c+(A[y][x]<mid?1:0),{y,x}});}}}// if(mid <= 10){// cout << "!? " << mid << endl;// REP(i,N){// REP(j,M){// cout << dp[i][j] << " ";// }cout << endl;// }// cout << endl;// }// cout << mid MM dp[N-1][M-1] << endl;if(dp[N-1][M-1] <= K){ok = mid;}else{ng = mid;}}cout << ok << endl;return 0;}