結果
| 問題 |
No.3121 Prime Dance
|
| コンテスト | |
| ユーザー |
沙耶花
|
| 提出日時 | 2025-04-18 22:46:19 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 419 ms / 2,000 ms |
| コード長 | 2,096 bytes |
| コンパイル時間 | 4,724 ms |
| コンパイル使用メモリ | 263,572 KB |
| 実行使用メモリ | 84,480 KB |
| 最終ジャッジ日時 | 2025-04-18 22:46:29 |
| 合計ジャッジ時間 | 8,659 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 21 |
ソースコード
#include <stdio.h>
#include <atcoder/all>
#include <bits/stdc++.h>
using namespace std;
using namespace atcoder;
using mint = modint998244353;
#define rep(i,n) for (int i = 0; i < (n); ++i)
#define Inf32 1000000001
#define Inf64 4000000000000000001LL
bool is_p(int n){
if(n<=1)return false;
for(int i=2;i<n;i++){
if(n%i==0)return false;
}
return true;
}
int main(){
vector<vector<int>> dis(45);
rep(i,900){
rep(j,45){
if(is_p(i)&&is_p(i+j)){
dis[j].push_back(i);
}
}
}
int h,w;
cin>>h>>w;
int sx,sy,gx,gy;
cin>>sx>>sy>>gx>>gy;
sx--,sy--,gx--,gy--;
vector<string> s(h);
rep(i,h)cin>>s[i];
s[sx][sy] = '.';
s[gx][gy] = '.';
vector d(h,vector(w,vector(900,vector<int>(2,Inf32))));
d[sx][sy][0][0] = 0;
deque<vector<int>> Q;
Q.push_back({sx,sy,0,0});
while(Q.size()>0){
vector<int> dx = {1,-1,0,0},dy = {0,0,1,-1};
int x = Q.front()[0],y = Q.front()[1],t = Q.front()[2],k = Q.front()[3];
Q.pop_front();
rep(i,4){
int nx = x+dx[i],ny = y+dy[i];
if(nx<0||nx>=h||ny<0||ny>=w)continue;
if(s[nx][ny] == '#')continue;
int nt = t,nk = k;
if(i==0)nt++;
if(i>=2)nk = 1;
if(nt >= 900)continue;
int nd = d[x][y][t][k];
if(i==2)nd++;
if(nd>=d[nx][ny][nt][nk])continue;
else{
d[nx][ny][nt][nk] = nd;
if(i!=2)Q.push_front({nx,ny,nt,nk});
else Q.push_back({nx,ny,nt,nk});
}
}
}
int ans = Inf32;
rep(i,900){
if(sx==gx && i==0)continue;
int cur = 0;
{
int dd = gx - sx;
int ii = i;
if(dd >= 0)ii -= dd;
dd = abs(dd);
int tt = distance(dis[dd].begin(),lower_bound(dis[dd].begin(),dis[dd].end(),ii));
if(tt == dis[dd].size())continue;
cur += dis[dd][tt] * 2 + dd;
}
{
int dd = gy - sy;
int ii = d[gx][gy][i][1];
if(sy!=gy)ii = min(ii, d[gx][gy][i][0]);
if(ii==Inf32)continue;
if(dd >= 0)ii -= dd;
dd = abs(dd);
int tt = distance(dis[dd].begin(),lower_bound(dis[dd].begin(),dis[dd].end(),ii));
if(tt == dis[dd].size())continue;
cur += dis[dd][tt] * 2 + dd;
}
ans = min(ans,cur);
}
if(ans == Inf32)cout<<-1<<endl;
else cout<<ans<<endl;
return 0;
}
沙耶花