Submission #221402

# Submission time Handle Problem Language Result Execution time Memory
221402 2020-04-10T02:17:13 Z rama_pang Wild Boar (JOI18_wild_boar) C++14
47 / 100
18000 ms 817456 KB
#include <bits/stdc++.h>
using namespace std;
using lint = long long;

const int MAXN = 2005;
const int MAXM = 4005;
const int MAXL = 100005;
const lint INF = 1e18;

struct edge_t {
  int u, v, w; // u = from, v = to, w = weight
  edge_t() {}
  edge_t(int u, int v, int w) : u(u), v(v), w(w) {}
};

int N, M, T, L;

namespace ShortestPath {

vector<edge_t> edges;
vector<int> adj[MAXN];

// Distance[X][Y][Use X?][Use Y?] = Shortest Path from edges[X].u to edges[Y].v that Use X? Use Y?
lint Distance[MAXM][MAXM][2][2];
int LastEdgeDistance[MAXM][MAXM][2][2]; // last edge used in Distance[][][][]

// ShortestPathEdge[X][edges[Y].v][use X?] = Y that has the shortest distance
int ShortestPathEdge[MAXM][MAXN][2]; 

void Read() {
  M = M * 2;
  for (int i = 0; i < (M / 2); i++) {
    int A, B, C;
    cin >> A >> B >> C;
    A--, B--;

    adj[A].emplace_back(edges.size());
    edges.emplace_back(A, B, C);

    adj[B].emplace_back(edges.size());
    edges.emplace_back(B, A, C);
  }
}

void Dijkstra(int X) { // Finds all Distance[X][][1][1]
  priority_queue<pair<lint, int>, vector<pair<lint, int>>, greater<pair<lint, int>>> pq;
  pq.emplace(edges[X].w, X);
  Distance[X][X][1][1] = edges[X].w; // from edges[X].u to edges[X].v

  // Run Dijkstra to find Distance[X][][1][1].
  // Make sure we do not do a U-turn.

  while (!pq.empty()) {
    int cur = pq.top().second;
    lint cur_dist = pq.top().first; 
    pq.pop();

    if (cur_dist != Distance[X][cur][1][1]) continue;
    int u = edges[cur].v;

    for (auto nxt : adj[u]) {
      if (cur == (nxt ^ 1)) continue; // We cannot U-turn back
      lint &nxt_dist = Distance[X][nxt][1][1];

      if (nxt_dist == -1 || nxt_dist > cur_dist + edges[nxt].w) {
        nxt_dist = cur_dist + edges[nxt].w;
        pq.emplace(nxt_dist, nxt);
      }
    }
  }
}

void Solve() { // Computes Distance[][][][] and ShortestPathEdge[][][]
  memset(Distance, -1, sizeof(Distance));
  memset(LastEdgeDistance, -1, sizeof(LastEdgeDistance));
  memset(ShortestPathEdge, -1, sizeof(ShortestPathEdge));

  // Computes Distance[][][1][1]
  for (int X = 0; X < M; X++) {
    Dijkstra(X);
    for (int Y = 0; Y < M; Y++) {
      if (Distance[X][Y][1][1] != -1) {
        LastEdgeDistance[X][Y][1][1] = Y;
      }
    }
  }

  // Computes Distance[][][1][0]
  for (int X = 0; X < M; X++) {
    vector<multiset<pair<lint, int>>> VertexDist(N);
    for (int Y = 0; Y < M; Y++) {
      VertexDist[edges[Y].v].emplace(Distance[X][Y][1][1], LastEdgeDistance[X][Y][1][1]);
    }
    for (int Y = 0; Y < M; Y++) {
      auto it = VertexDist[edges[Y].v].find({Distance[X][Y][1][1], LastEdgeDistance[X][Y][1][1]});
      VertexDist[edges[Y].v].erase(it);
      if (!VertexDist[edges[Y].v].empty()) {
        Distance[X][Y][1][0] = begin(VertexDist[edges[Y].v])->first;
        LastEdgeDistance[X][Y][1][0] = begin(VertexDist[edges[Y].v])->second;
      }
      VertexDist[edges[Y].v].emplace(Distance[X][Y][1][1], LastEdgeDistance[X][Y][1][1]);
    }
  }

  // Computes Distance[][][0][1]
  for (int Y = 0; Y < M; Y++) {
    vector<multiset<lint>> VertexDist(N);
    for (int X = 0; X < M; X++) {
      VertexDist[edges[X].u].emplace(Distance[X][Y][1][1]);
    }
    for (int X = 0; X < M; X++) {
      auto it = VertexDist[edges[X].u].find(Distance[X][Y][1][1]);
      VertexDist[edges[X].u].erase(it);
      if (!VertexDist[edges[X].u].empty()) {
        Distance[X][Y][0][1] = *begin(VertexDist[edges[X].u]);
        LastEdgeDistance[X][Y][0][1] = Y;
      }
      VertexDist[edges[X].u].emplace(Distance[X][Y][1][1]);
    }
  }

  // Computes Distance[][][0][0]
  for (int X = 0; X < M; X++) {
    vector<multiset<pair<lint, int>>> VertexDist(N);
    for (int Y = 0; Y < M; Y++) {
      VertexDist[edges[Y].v].emplace(Distance[X][Y][0][1], LastEdgeDistance[X][Y][0][1]);
    }
    for (int Y = 0; Y < M; Y++) {
      auto it = VertexDist[edges[Y].v].find({Distance[X][Y][0][1], LastEdgeDistance[X][Y][0][1]});
      VertexDist[edges[Y].v].erase(it);
      if (!VertexDist[edges[Y].v].empty()) {
        Distance[X][Y][0][0] = begin(VertexDist[edges[Y].v])->first;
        LastEdgeDistance[X][Y][0][0] = begin(VertexDist[edges[Y].v])->second;
      }
      VertexDist[edges[Y].v].emplace(Distance[X][Y][0][1], LastEdgeDistance[X][Y][0][1]);
    }
  }

  // Computes ShortestPathEdge[][][]
  for (int X = 0; X < M; X++) {
    for (int Y = 0; Y < M; Y++) {
      int V = edges[Y].v;
      int &SPE = ShortestPathEdge[X][V][1];
      if (Distance[X][Y][1][1] == -1) continue;
      if (SPE == -1 || Distance[X][SPE][1][1] > Distance[X][Y][1][1]) {
        SPE = Y;
      }
    }
    for (int Y = 0; Y < M; Y++) {
      int V = edges[Y].v;
      int &SPE = ShortestPathEdge[X][V][0];
      if (Distance[X][Y][0][1] == -1) continue;
      if (SPE == -1 || Distance[X][SPE][0][1] > Distance[X][Y][0][1]) {
        SPE = Y;
      }
    }
  }
}

}

namespace DynamicProgramming {

int X[MAXL];

void Read() {
  for (int i = 0; i < L; i++) {
    cin >> X[i];
    X[i]--;
  }

  // T = 1
  int P, Q;
  cin >> P >> Q;
  X[--P] = --Q;
}

long long Solve() {
  vector<long long> dp(M, INF), next_dp(M, INF);

  // Special Case for pos = 0
  for (auto i : ShortestPath::adj[X[0]]) {
    for (int j = 0; j < M; j++) {
      if (ShortestPath::edges[j].v == X[1] && ShortestPath::Distance[i][j][1][1] != -1) {
        dp[j] = min(dp[j], ShortestPath::Distance[i][j][1][1]);
      }
    }
  }

  for (int pos = 1; pos < L - 1; pos++) {
    for (int last_edge = 0; last_edge < M; last_edge++) {
      if (ShortestPath::edges[last_edge].v != X[pos]) continue;

      int nxt_edge = ShortestPath::ShortestPathEdge[last_edge][X[pos + 1]][1];
      if (nxt_edge == -1) continue;

      next_dp[nxt_edge] = min(next_dp[nxt_edge], 
        dp[last_edge] + ShortestPath::Distance[last_edge][nxt_edge][1][1] - ShortestPath::edges[last_edge].w);
      
      int exclude_nxt_edge = ShortestPath::LastEdgeDistance[last_edge][nxt_edge][1][0];
      if (exclude_nxt_edge == -1) continue;
      next_dp[exclude_nxt_edge] = min(next_dp[exclude_nxt_edge], 
        dp[last_edge] + ShortestPath::Distance[last_edge][exclude_nxt_edge][1][1] - ShortestPath::edges[last_edge].w);
    }

    dp = next_dp;
    next_dp.assign(M, INF);
  }

  long long res = *min_element(begin(dp), end(dp));
  if (res == INF) res = -1;
  return res;
}

}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);

  cin >> N >> M >> T >> L;

  ShortestPath::Read();
  ShortestPath::Solve();

  DynamicProgramming::Read();
  cout << DynamicProgramming::Solve() << "\n";

  return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 475 ms 816756 KB Output is correct
2 Correct 391 ms 816632 KB Output is correct
3 Correct 391 ms 816632 KB Output is correct
4 Correct 394 ms 816632 KB Output is correct
5 Correct 383 ms 816632 KB Output is correct
6 Correct 403 ms 816560 KB Output is correct
7 Correct 392 ms 816648 KB Output is correct
8 Correct 394 ms 816732 KB Output is correct
9 Correct 386 ms 816632 KB Output is correct
10 Correct 397 ms 816632 KB Output is correct
11 Correct 393 ms 816632 KB Output is correct
12 Correct 407 ms 816632 KB Output is correct
13 Correct 393 ms 816504 KB Output is correct
14 Correct 394 ms 816760 KB Output is correct
15 Correct 398 ms 816632 KB Output is correct
16 Correct 391 ms 816760 KB Output is correct
17 Correct 398 ms 816636 KB Output is correct
18 Correct 401 ms 816616 KB Output is correct
19 Correct 391 ms 816632 KB Output is correct
20 Correct 401 ms 816632 KB Output is correct
21 Correct 391 ms 816632 KB Output is correct
22 Correct 397 ms 816632 KB Output is correct
23 Correct 399 ms 816576 KB Output is correct
24 Correct 397 ms 816664 KB Output is correct
25 Correct 400 ms 816636 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 475 ms 816756 KB Output is correct
2 Correct 391 ms 816632 KB Output is correct
3 Correct 391 ms 816632 KB Output is correct
4 Correct 394 ms 816632 KB Output is correct
5 Correct 383 ms 816632 KB Output is correct
6 Correct 403 ms 816560 KB Output is correct
7 Correct 392 ms 816648 KB Output is correct
8 Correct 394 ms 816732 KB Output is correct
9 Correct 386 ms 816632 KB Output is correct
10 Correct 397 ms 816632 KB Output is correct
11 Correct 393 ms 816632 KB Output is correct
12 Correct 407 ms 816632 KB Output is correct
13 Correct 393 ms 816504 KB Output is correct
14 Correct 394 ms 816760 KB Output is correct
15 Correct 398 ms 816632 KB Output is correct
16 Correct 391 ms 816760 KB Output is correct
17 Correct 398 ms 816636 KB Output is correct
18 Correct 401 ms 816616 KB Output is correct
19 Correct 391 ms 816632 KB Output is correct
20 Correct 401 ms 816632 KB Output is correct
21 Correct 391 ms 816632 KB Output is correct
22 Correct 397 ms 816632 KB Output is correct
23 Correct 399 ms 816576 KB Output is correct
24 Correct 397 ms 816664 KB Output is correct
25 Correct 400 ms 816636 KB Output is correct
26 Correct 407 ms 816640 KB Output is correct
27 Correct 467 ms 817272 KB Output is correct
28 Correct 473 ms 817288 KB Output is correct
29 Correct 916 ms 817392 KB Output is correct
30 Correct 939 ms 817400 KB Output is correct
31 Correct 1020 ms 817324 KB Output is correct
32 Correct 1087 ms 817400 KB Output is correct
33 Correct 843 ms 817400 KB Output is correct
34 Correct 880 ms 817456 KB Output is correct
35 Correct 975 ms 817188 KB Output is correct
36 Correct 900 ms 817276 KB Output is correct
37 Correct 873 ms 817400 KB Output is correct
38 Correct 834 ms 817400 KB Output is correct
39 Correct 839 ms 817272 KB Output is correct
40 Correct 817 ms 817420 KB Output is correct
41 Correct 824 ms 817400 KB Output is correct
42 Correct 808 ms 817400 KB Output is correct
43 Correct 809 ms 817400 KB Output is correct
44 Correct 786 ms 817432 KB Output is correct
45 Correct 731 ms 817400 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 475 ms 816756 KB Output is correct
2 Correct 391 ms 816632 KB Output is correct
3 Correct 391 ms 816632 KB Output is correct
4 Correct 394 ms 816632 KB Output is correct
5 Correct 383 ms 816632 KB Output is correct
6 Correct 403 ms 816560 KB Output is correct
7 Correct 392 ms 816648 KB Output is correct
8 Correct 394 ms 816732 KB Output is correct
9 Correct 386 ms 816632 KB Output is correct
10 Correct 397 ms 816632 KB Output is correct
11 Correct 393 ms 816632 KB Output is correct
12 Correct 407 ms 816632 KB Output is correct
13 Correct 393 ms 816504 KB Output is correct
14 Correct 394 ms 816760 KB Output is correct
15 Correct 398 ms 816632 KB Output is correct
16 Correct 391 ms 816760 KB Output is correct
17 Correct 398 ms 816636 KB Output is correct
18 Correct 401 ms 816616 KB Output is correct
19 Correct 391 ms 816632 KB Output is correct
20 Correct 401 ms 816632 KB Output is correct
21 Correct 391 ms 816632 KB Output is correct
22 Correct 397 ms 816632 KB Output is correct
23 Correct 399 ms 816576 KB Output is correct
24 Correct 397 ms 816664 KB Output is correct
25 Correct 400 ms 816636 KB Output is correct
26 Correct 407 ms 816640 KB Output is correct
27 Correct 467 ms 817272 KB Output is correct
28 Correct 473 ms 817288 KB Output is correct
29 Correct 916 ms 817392 KB Output is correct
30 Correct 939 ms 817400 KB Output is correct
31 Correct 1020 ms 817324 KB Output is correct
32 Correct 1087 ms 817400 KB Output is correct
33 Correct 843 ms 817400 KB Output is correct
34 Correct 880 ms 817456 KB Output is correct
35 Correct 975 ms 817188 KB Output is correct
36 Correct 900 ms 817276 KB Output is correct
37 Correct 873 ms 817400 KB Output is correct
38 Correct 834 ms 817400 KB Output is correct
39 Correct 839 ms 817272 KB Output is correct
40 Correct 817 ms 817420 KB Output is correct
41 Correct 824 ms 817400 KB Output is correct
42 Correct 808 ms 817400 KB Output is correct
43 Correct 809 ms 817400 KB Output is correct
44 Correct 786 ms 817432 KB Output is correct
45 Correct 731 ms 817400 KB Output is correct
46 Correct 1229 ms 816760 KB Output is correct
47 Execution timed out 18123 ms 817072 KB Time limit exceeded
48 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 475 ms 816756 KB Output is correct
2 Correct 391 ms 816632 KB Output is correct
3 Correct 391 ms 816632 KB Output is correct
4 Correct 394 ms 816632 KB Output is correct
5 Correct 383 ms 816632 KB Output is correct
6 Correct 403 ms 816560 KB Output is correct
7 Correct 392 ms 816648 KB Output is correct
8 Correct 394 ms 816732 KB Output is correct
9 Correct 386 ms 816632 KB Output is correct
10 Correct 397 ms 816632 KB Output is correct
11 Correct 393 ms 816632 KB Output is correct
12 Correct 407 ms 816632 KB Output is correct
13 Correct 393 ms 816504 KB Output is correct
14 Correct 394 ms 816760 KB Output is correct
15 Correct 398 ms 816632 KB Output is correct
16 Correct 391 ms 816760 KB Output is correct
17 Correct 398 ms 816636 KB Output is correct
18 Correct 401 ms 816616 KB Output is correct
19 Correct 391 ms 816632 KB Output is correct
20 Correct 401 ms 816632 KB Output is correct
21 Correct 391 ms 816632 KB Output is correct
22 Correct 397 ms 816632 KB Output is correct
23 Correct 399 ms 816576 KB Output is correct
24 Correct 397 ms 816664 KB Output is correct
25 Correct 400 ms 816636 KB Output is correct
26 Correct 407 ms 816640 KB Output is correct
27 Correct 467 ms 817272 KB Output is correct
28 Correct 473 ms 817288 KB Output is correct
29 Correct 916 ms 817392 KB Output is correct
30 Correct 939 ms 817400 KB Output is correct
31 Correct 1020 ms 817324 KB Output is correct
32 Correct 1087 ms 817400 KB Output is correct
33 Correct 843 ms 817400 KB Output is correct
34 Correct 880 ms 817456 KB Output is correct
35 Correct 975 ms 817188 KB Output is correct
36 Correct 900 ms 817276 KB Output is correct
37 Correct 873 ms 817400 KB Output is correct
38 Correct 834 ms 817400 KB Output is correct
39 Correct 839 ms 817272 KB Output is correct
40 Correct 817 ms 817420 KB Output is correct
41 Correct 824 ms 817400 KB Output is correct
42 Correct 808 ms 817400 KB Output is correct
43 Correct 809 ms 817400 KB Output is correct
44 Correct 786 ms 817432 KB Output is correct
45 Correct 731 ms 817400 KB Output is correct
46 Correct 1229 ms 816760 KB Output is correct
47 Execution timed out 18123 ms 817072 KB Time limit exceeded
48 Halted 0 ms 0 KB -