結果
問題 |
No.3121 Prime Dance
|
ユーザー |
|
提出日時 | 2025-04-19 12:48:45 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 5,443 bytes |
コンパイル時間 | 4,776 ms |
コンパイル使用メモリ | 308,564 KB |
実行使用メモリ | 257,408 KB |
最終ジャッジ日時 | 2025-04-19 12:49:04 |
合計ジャッジ時間 | 14,633 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 19 WA * 2 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:177:18: warning: overflow in conversion from ‘long long int’ to ‘std::vector<int>::value_type’ {aka ‘int’} changes value from ‘1152921504606846976’ to ‘0’ [-Woverflow] 177 | px.push_back(INF); | ^~~ main.cpp:178:18: warning: overflow in conversion from ‘long long int’ to ‘std::vector<int>::value_type’ {aka ‘int’} changes value from ‘1152921504606846976’ to ‘0’ [-Woverflow] 178 | py.push_back(INF); | ^~~
ソースコード
/* from collections import deque from bisect import bisect_left H,W=map(int,input().split()) sx,sy=map(int,input().split()) gx,gy=map(int,input().split()) S=["#"*(W+2) for i in range(H+2)] for i in range(H): S[i+1]="#"+input()+"#" S=[list(s) for s in S] S[sx][sy]="." S[gx][gy]="." H+=2 W+=2 num=[[0]*W for i in range(H)] for i in range(1,H-1): for j in range(1,W-1): if S[i-1][j]=="." or S[i+1][j]==".": num[i][j]^=1 if S[i][j-1]=="." or S[i][j+1]==".": num[i][j]^=2 dist=[[[[1<<60]*4 for i in range(2000)] for i in range(W)] for i in range(H)] dist[sx][sy][0][num[sx][sy]]=0 vert=deque() vert.append((0,sx,sy,0,num[sx][sy])) while vert: d,x,y,r,b=vert.popleft() if dist[x][y][r][b]!=d: continue if S[x+1][y]==".": if dist[x+1][y][r][b|num[x+1][y]]>d+1: dist[x+1][y][r][b|num[x+1][y]]=d+1 vert.append((d+1,x+1,y,r,b|num[x+1][y])) if S[x-1][y]==".": if dist[x-1][y][r][b|num[x-1][y]]>d: dist[x-1][y][r][b|num[x-1][y]]=d vert.appendleft((d,x-1,y,r,b|num[x-1][y])) if S[x][y+1]==".": if r!=1999 and dist[x][y+1][r+1][b|num[x][y+1]]>d: dist[x][y+1][r+1][b|num[x][y+1]]=d vert.appendleft((d,x,y+1,r+1,b|num[x][y+1])) if S[x][y-1]==".": if dist[x][y-1][r][b|num[x][y-1]]>d: dist[x][y-1][r][b|num[x][y-1]]=d vert.appendleft((d,x,y-1,r,b|num[x][y-1])) swx=gx-sx swy=gy-sy X=50000 primes=[1]*X primes[0]=0 primes[1]=0 for i in range(2,X): if primes[i]==0: continue for j in range(i*2,X,i): primes[j]=0 px=[] py=[] for i in range(X): if 0<=i-swx<X and primes[i] and primes[i-swx]: px.append(i) for i in range(X): if 0<=i-swy<X and primes[i] and primes[i-swy]: py.append(i) px.append(1<<60) py.append(1<<60) ans=1<<60 for i in range(2000): ans=min(ans,(px[bisect_left(px,dist[gx][gy][i][3])]+py[bisect_left(py,i)])*2-swx-swy) if ans>=(1<<60): print(-1) else: print(ans) */ #include <bits/stdc++.h> using namespace std; using ll = long long; const ll INF = 1LL << 60; int main() { int H, W; cin >> H >> W; int sx, sy, gx, gy; cin >> sx >> sy >> gx >> gy; vector<string> S(H + 2, string(W + 2, '#')); for (int i = 0; i < H; ++i) { string row; cin >> row; S[i + 1] = "#" + row + "#"; } H += 2; W += 2; S[sx][sy] = '.'; S[gx][gy] = '.'; vector<vector<int>> num(H, vector<int>(W, 0)); for (int i = 1; i < H - 1; ++i) { for (int j = 1; j < W - 1; ++j) { if (S[i - 1][j] == '.' || S[i + 1][j] == '.') num[i][j] ^= 1; if (S[i][j - 1] == '.' || S[i][j + 1] == '.') num[i][j] ^= 2; } } vector<vector<vector<vector<ll>>>> dist(H, vector<vector<vector<ll>>>(W, vector<vector<ll>>(2000, vector<ll>(4, INF)))); dist[sx][sy][0][num[sx][sy]] = 0; deque<tuple<ll, int, int, int, int>> vert; vert.emplace_back(0, sx, sy, 0, num[sx][sy]); while (!vert.empty()) { auto [d, x, y, r, b] = vert.front(); vert.pop_front(); if (dist[x][y][r][b] != d) continue; if (S[x + 1][y] == '.') { int nb = b | num[x + 1][y]; if (dist[x + 1][y][r][nb] > d + 1) { dist[x + 1][y][r][nb] = d + 1; vert.emplace_back(d + 1, x + 1, y, r, nb); } } if (S[x - 1][y] == '.') { int nb = b | num[x - 1][y]; if (dist[x - 1][y][r][nb] > d) { dist[x - 1][y][r][nb] = d; vert.emplace_front(d, x - 1, y, r, nb); } } if (S[x][y + 1] == '.') { if (r != 1999) { int nb = b | num[x][y + 1]; if (dist[x][y + 1][r + 1][nb] > d) { dist[x][y + 1][r + 1][nb] = d; vert.emplace_front(d, x, y + 1, r + 1, nb); } } } if (S[x][y - 1] == '.') { int nb = b | num[x][y - 1]; if (dist[x][y - 1][r][nb] > d) { dist[x][y - 1][r][nb] = d; vert.emplace_front(d, x, y - 1, r, nb); } } } int swx = gx - sx; int swy = gy - sy; const int X = 50000; vector<bool> primes(X, true); primes[0] = primes[1] = false; for (int i = 2; i < X; ++i) { if (!primes[i]) continue; for (int j = i * 2; j < X; j += i) { primes[j] = false; } } vector<int> px, py; for (int i = 0; i < X; ++i) { if (i - swx >= 0 && i - swx < X && primes[i] && primes[i - swx]) { px.push_back(i); } } for (int i = 0; i < X; ++i) { if (i - swy >= 0 && i - swy < X && primes[i] && primes[i - swy]) { py.push_back(i); } } px.push_back(INF); py.push_back(INF); ll ans = INF; for (int i = 0; i < 2000; ++i) { ll d = dist[gx][gy][i][3]; int ix = lower_bound(px.begin(), px.end(), d) - px.begin(); int iy = lower_bound(py.begin(), py.end(), i) - py.begin(); if (ix < px.size() && iy < py.size()) { ll cand = (ll(px[ix]) + ll(py[iy])) * 2 - swx - swy; ans = min(ans, cand); } } if (ans >= INF) { cout << -1 << endl; } else { cout << ans << endl; } return 0; }