#include #include #include #include //dp[i][j][k]=(i,j)に時刻kにいる時の疲労度の最小値 //TにN+M-2を加えた上で,k<=2*(N+M-2)のみを考えれば良い const std::pair dij[]={{1,0},{0,1},{-1,0},{0,-1}}; const long long INF=1e18; using P=std::pair>; bool chmin(long long &a,long long b){ if(a>b)return a=b,true; return false; } int main(){ int N,M,K,T; std::cin >> N >> M >> K >> T; std::vector magic(N,std::vector(M,std::pair(0,0))); for(int i=0;i> a >> b >> c >> d; magic[a-1][b-1]={c,d}; } if(T>=N+M-2){ std::cout << 0 << '\n'; return 0; } T+=N+M-2; const int MAX_TIME=(N+M-2)*2; std::vector dp(N,std::vector(M,std::vector(MAX_TIME+1,INF))); dp[0][0][N+M-2]=0; std::priority_queue,std::greater

> q; q.push({0LL,{0,0,N+M-2}}); while(!q.empty()){ auto [dist,p]=q.top();q.pop(); auto [i,j,nowt]=p; if(dp[i][j][nowt] < dist)continue;//これを抜くと落ちるケースは欲しい. //魔法を使わない移動 コストは0 for(auto [di,dj]:dij){ int ni=i+di, nj=j+dj; if(0<=ni && ni