結果
| 問題 |
No.2366 登校
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-07-05 12:49:07 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 572 ms / 4,000 ms |
| コード長 | 2,049 bytes |
| コンパイル時間 | 1,114 ms |
| コンパイル使用メモリ | 121,472 KB |
| 実行使用メモリ | 20,608 KB |
| 最終ジャッジ日時 | 2025-06-20 11:13:10 |
| 合計ジャッジ時間 | 4,973 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 26 |
ソースコード
#include<iostream>
#include<set>
#include<algorithm>
#include<vector>
#include<string>
#include<set>
#include<map>
#include<numeric>
#include<queue>
#include<cmath>
using namespace std;
typedef long long ll;
const ll INF=1LL<<60;
typedef pair<ll,ll> P;
typedef pair<int,P> PP;
const ll MOD=998244353;
const int dx[]={-1,0,1,0};
const int dy[]={0,-1,0,1};
int main(){
int N,M,K,T;
cin>>N>>M>>K>>T;
vector<vector<P>> back(N,vector<P>(M,make_pair(0,0)));
for(int i=0;i<K;i++){
int a,b;
ll c,d;
cin>>a>>b>>c>>d;
a--;b--;
back[a][b]=make_pair(c,d);
}
ll offset=N+M+3;
vector dp(N,vector<vector<ll>>(M,vector<ll>(2*(N+M)+10,INF)));
typedef tuple<ll,ll,ll,ll> TP;
priority_queue<TP,vector<TP>,greater<TP>> pq;
pq.emplace(0,0,0,0);
while(!pq.empty()){
auto [val,nowi,nowj,nowt] = pq.top();//valは負の値.ちいさいほうから
pq.pop();
ll cost=val;
if(dp[nowi][nowj][nowt+offset]<=cost) continue;
//dp[nowi][nowj][nowt+offset]>cost
dp[nowi][nowj][nowt+offset]=cost;
for(int k=0;k<4;k++){
int ni=nowi+dy[k];
int nj=nowj+dx[k];
if(ni<0 || N<=ni || nj<0 || M<=nj) continue;
ll totime=nowt+1;
if(totime+offset<2*(N+M)+10){
if(dp[ni][nj][totime+offset]>cost ){
pq.emplace(cost,ni,nj,totime);
}
}
}
if(back[nowi][nowj]!=make_pair(0LL,0LL)){
auto [ci,di]=back[nowi][nowj];
ll totime = nowt-ci+1;
if(totime<-(N+M-2)){
totime=-(N+M-2);
}
if(dp[nowi][nowj][totime+offset]>(cost+di) ){
pq.emplace((cost+di),nowi,nowj,totime);
}
}
}
ll ans=INF;
for(int t=0;t<2*(N+M)+10 && t<=T+offset;t++){
ans=min(ans,dp[N-1][M-1][t]);
}
cout<<(ans==INF?-1:ans)<<endl;
}