Submission #26938

#TimeUsernameProblemLanguageResultExecution timeMemory
26938kajebiiiSoccer (JOI17_soccer)C++14
100 / 100
366 ms25632 KiB
#include <stdio.h> #include <bits/stdc++.h> using namespace std; #define SZ(v) ((int)(v).size()) #define ALL(v) (v).begin(),(v).end() #define one first #define two second typedef long long ll; typedef pair<int, int> pi; typedef pair<ll, int> pli; typedef tuple<int, int, int> ti; const int INF = 0x3f2f1f0f; const ll LINF = 1ll * INF * INF; const int MAX_L = 5e2 + 10; struct ND { ll d; pi p; int t; ND() {} ND(ll dd, pi pp, int tt) : d(dd), p(pp), t(tt) {} bool operator<(const ND &o) const{return d > o.d;} }; int H, W, N; bool Vis[MAX_L][MAX_L][5]; ll A, B, C, Move[MAX_L][MAX_L], Dis[MAX_L][MAX_L][5]; pi St, En; int main() { cin >> H >> W >> A >> B >> C >> N; for(int i=0; i<=H; i++) for(int j=0; j<=W; j++) { Move[i][j] = LINF; for(int k=0; k<5; k++) Dis[i][j][k] = LINF; } queue<pi> mQ; for(int i=0; i<N; i++) { int x, y; scanf("%d%d", &x, &y); if(i == 0) St = pi(x, y); if(i+1 == N) En = pi(x, y); mQ.push(pi(x, y)); Move[x][y] = 0; } while(!mQ.empty()) { int x, y; tie(x, y) = mQ.front(); mQ.pop(); for(int k=0; k<4; k++) { int nx = x + "1012"[k] - '1', ny = y + "0121"[k] - '1'; if(nx < 0 || ny < 0 || nx > H || ny > W) continue; if(Move[nx][ny] > Move[x][y] + C) { Move[nx][ny] = Move[x][y] + C; mQ.push(pi(nx, ny)); } } } priority_queue<ND> Q; Q.push(ND(0ll, St, 4)); Dis[St.one][St.two][4] = 0ll; while(!Q.empty()) { ND temp = Q.top(); Q.pop(); ll d = temp.d; int x, y; tie(x, y) = temp.p; int t = temp.t; if(Vis[x][y][t]) continue; Vis[x][y][t] = true; // printf("%lld %d %d %d [%d %d]\n", d, x, y, t, En.one, En.two); if(x == En.one && y == En.two) { printf("%lld\n", d); return 0; } if(t == 4) { for(int k=0; k<4; k++) { int nx = x + "1012"[k] - '1', ny = y + "0121"[k] - '1'; if(Dis[x][y][k] > d + B) Q.push(ND(Dis[x][y][k] = d+B, pi(x, y), k)); if(nx < 0 || ny < 0 || nx > H || ny > W) continue; if(Dis[nx][ny][4] > d + C) Q.push(ND(Dis[nx][ny][4] = d+C, pi(nx, ny), 4)); } } else { int nx = x + "1012"[t] - '1', ny = y + "0121"[t] - '1'; if(!(nx < 0 || ny < 0 || nx > H || ny > W)) if(Dis[nx][ny][t] > d + A) Q.push(ND(Dis[nx][ny][t] = d+A, pi(nx, ny), t)); if(Dis[x][y][4] > d + Move[x][y]) Q.push(ND(Dis[x][y][4] = d + Move[x][y], pi(x, y), 4)); } } return 0; }

Compilation message (stderr)

soccer.cpp: In function 'int main()':
soccer.cpp:37:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int x, y; scanf("%d%d", &x, &y);
                                  ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...