답안 #565513

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
565513 2022-05-21T03:01:39 Z maomao90 Wild Boar (JOI18_wild_boar) C++17
100 / 100
5934 ms 902436 KB
// Hallelujah, praise the one who set me free
// Hallelujah, death has lost its grip on me
// You have broken every chain, There's salvation in your name
// Jesus Christ, my living hope
#include <bits/stdc++.h> 
using namespace std;

template <class T>
inline bool mnto(T& a, T b) {return a > b ? a = b, 1 : 0;}
template <class T>
inline bool mxto(T& a, T b) {return a < b ? a = b, 1: 0;}
#define REP(i, s, e) for (int i = s; i < e; i++)
#define RREP(i, s, e) for (int i = s; i >= e; i--)
typedef long long ll;
typedef long double ld;
#define FI first
#define SE second
typedef pair<int, int> ii;
typedef pair<ll, ll> pll;
typedef tuple<int, int, int> iii;
typedef tuple<ll, ll, ll> tll;
#define ALL(_a) _a.begin(), _a.end()
#define pb push_back
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<ii> vii;
typedef vector<iii> viii;

#ifndef DEBUG
#define cerr if (0) cerr
#endif

const int INF = 1000000005;
const ll LINF = 1000000000000000005ll;
const int MAXN = 2005;
const int MAXL = 100005;
const int BAG = 5;

int n, m, t, l, e;
vi adj[MAXN * 3];
int w[MAXN * 3];
int x[MAXL];
ll rd[MAXN][MAXN][BAG];
int fi[MAXN][MAXN][BAG], se[MAXN][MAXN][BAG];

int par[MAXN][2];
ll dist[MAXN * 3][MAXN * 3][2];
priority_queue<tll, vector<tll>, greater<tll>> pq;
void dijkstra(int s) {
    REP (i, 0, e) {
        dist[s][i][0] = dist[s][i][1] = LINF;
    }
    REP (i, 0, n + 1) {
        par[i][0] = par[i][1] = -1;
        if (s <= n) {
            fi[s][i][0] = se[s][i][0] = -1;
        }
    }
    dist[s][s][0] = w[s];
    pq.push(tll{w[s], s, 0});
    while (!pq.empty()) {
        auto [d, u, tp] = pq.top(); pq.pop();
        if (d != dist[s][u][tp]) continue;
        for (int v : adj[u]) {
            int cpar = par[u][tp];
            if (u <= n && v > n && (v ^ 1) == cpar) {
                continue;
            }
            if (u > n) {
                cpar = adj[u ^ 1][0];
            }
            ll nd = d + w[v];
            if (mnto(dist[s][v][0], nd)) {
                pq.push(tll{nd, v, 0});
                if (v <= n) {
                    if (s <= n) {
                        fi[s][v][0] = fi[s][cpar][0] == -1 ? u : fi[s][cpar][0];
                        se[s][v][0] = u;
                    }
                    par[v][0] = u;
                }
            } else if (mnto(dist[s][v][1], nd) && v <= n && par[v][0] != u) {
                pq.push(tll{nd, v, 1});
                par[v][1] = u;
            }
        }
    }
}

bool toprint;
ll dp[MAXL * 4][BAG];
int dpfi[MAXL * 4][BAG], dpse[MAXL * 4][BAG];
void upd(int p, int u = 1, int lo = 1, int hi = l) {
    if (hi - lo == 1) {
        REP (i, 0, BAG) {
            dp[u][i] = rd[x[lo]][x[hi]][i];
            dpfi[u][i] = fi[x[lo]][x[hi]][i];
            dpse[u][i] = se[x[lo]][x[hi]][i];
        }
        return;
    }
    int mid = lo + hi >> 1;
    int lc = u << 1, rc = u << 1 ^ 1;
    if (p <= mid) {
        upd(p, lc, lo, mid);
    }
    if (p >= mid) {
        upd(p, rc, mid, hi);
    }
    dp[u][0] = LINF;
    REP (l, 0, BAG) {
        REP (r, 0, BAG) {
            if ((dpse[lc][l] ^ 1) == dpfi[rc][r]) {
                continue;
            }
            if (mnto(dp[u][0], dp[lc][l] + dp[rc][r])) {
                dpfi[u][0] = dpfi[lc][l];
                dpse[u][0] = dpse[rc][r];
            }
        }
    }
    dp[u][1] = LINF;
    REP (l, 0, BAG) {
        REP (r, 0, BAG) {
            if ((dpse[lc][l] ^ 1) == dpfi[rc][r]) {
                continue;
            }
            if (dpfi[lc][l] == dpfi[u][0]) {
                continue;
            }
            if (mnto(dp[u][1], dp[lc][l] + dp[rc][r])) {
                dpfi[u][1] = dpfi[lc][l];
                dpse[u][1] = dpse[rc][r];
            }
        }
    }
    dp[u][2] = LINF;
    REP (l, 0, BAG) {
        REP (r, 0, BAG) {
            if ((dpse[lc][l] ^ 1) == dpfi[rc][r]) {
                continue;
            }
            if (dpfi[lc][l] == dpfi[u][0] || dpse[rc][r] == dpse[u][1]) {
                continue;
            }
            if (mnto(dp[u][2], dp[lc][l] + dp[rc][r])) {
                dpfi[u][2] = dpfi[lc][l];
                dpse[u][2] = dpse[rc][r];
            }
        }
    }
    dp[u][3] = LINF;
    REP (l, 0, BAG) {
        REP (r, 0, BAG) {
            if ((dpse[lc][l] ^ 1) == dpfi[rc][r]) {
                continue;
            }
            if (dpse[rc][r] == dpse[u][0]) {
                continue;
            }
            if (mnto(dp[u][3], dp[lc][l] + dp[rc][r])) {
                dpfi[u][3] = dpfi[lc][l];
                dpse[u][3] = dpse[rc][r];
            }
        }
    }
    dp[u][4] = LINF;
    REP (l, 0, BAG) {
        REP (r, 0, BAG) {
            if ((dpse[lc][l] ^ 1) == dpfi[rc][r]) {
                continue;
            }
            if (dpse[rc][r] == dpse[u][0] || dpfi[lc][l] == dpfi[u][3]) {
                continue;
            }
            if (mnto(dp[u][4], dp[lc][l] + dp[rc][r])) {
                dpfi[u][4] = dpfi[lc][l];
                dpse[u][4] = dpse[rc][r];
            }
        }
    }
}

int main() {
#ifndef DEBUG
    ios::sync_with_stdio(0), cin.tie(0);
#endif
    cin >> n >> m >> t >> l;
    e = n + 1;
    if (e & 1) {
        e++;
    }
    REP (i, 0, m) {
        int a, b, c; cin >> a >> b >> c;
        w[e] = c;
        adj[a].pb(e);
        adj[e].pb(b);
        e++;
        w[e] = c;
        adj[b].pb(e);
        adj[e].pb(a);
        e++;
    }
    REP (i, 1, e) {
        dijkstra(i);
    }
    REP (i, 1, n + 1) {
        REP (j, 1, n + 1) {
            if (i == j) continue;
            REP (z, 0, BAG) {
                rd[i][j][z] = LINF;
            }
            rd[i][j][0] = dist[i][j][0];
            for (int u : adj[i]) {
                for (int v : adj[j]) {
                    v ^= 1;
                    REP (z, 1, 3) {
                        if ((z == 1 && u == fi[i][j][0]) ||
                                (z == 2 && v == se[i][j][0])) {
                            continue;
                        }
                        if (mnto(rd[i][j][z], dist[u][v][0])) {
                            fi[i][j][z] = u;
                            se[i][j][z] = v;
                        }
                    }
                }
            }
            if (rd[i][j][1] != LINF) {
                for (int u : adj[i]) {
                    for (int v : adj[j]) {
                        v ^= 1;
                        if (u == fi[i][j][0] || v == se[i][j][1]) continue;
                        if (mnto(rd[i][j][3], dist[u][v][0])) {
                            fi[i][j][3] = u;
                            se[i][j][3] = v;
                        }
                    }
                }
            }
            if (rd[i][j][2] != LINF) {
                for (int u : adj[i]) {
                    for (int v : adj[j]) {
                        v ^= 1;
                        if (u == fi[i][j][2] || v == se[i][j][0]) continue;
                        if (mnto(rd[i][j][4], dist[u][v][0])) {
                            fi[i][j][4] = u;
                            se[i][j][4] = v;
                        }
                    }
                }
            }
        }
    }
    x[0] = -1;
    REP (i, 1, l + 1) {
        cin >> x[i];
    }
    REP (i, 1, l + 1) {
        upd(i);
    }
    while (t--) {
        int p, q; cin >> p >> q;
        x[p] = q;
        upd(p);
        ll ans = LINF;
        REP (i, 0, BAG) {
            mnto(ans, dp[1][i]);
        }
        if (ans == LINF) {
            ans = -1;
        }
        cout << ans << '\n';
    }
    return 0;
}

Compilation message

wild_boar.cpp: In function 'void upd(int, int, int, int)':
wild_boar.cpp:102:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  102 |     int mid = lo + hi >> 1;
      |               ~~~^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 596 KB Output is correct
2 Correct 1 ms 596 KB Output is correct
3 Correct 1 ms 604 KB Output is correct
4 Correct 1 ms 604 KB Output is correct
5 Correct 1 ms 596 KB Output is correct
6 Correct 1 ms 596 KB Output is correct
7 Correct 1 ms 724 KB Output is correct
8 Correct 1 ms 732 KB Output is correct
9 Correct 1 ms 724 KB Output is correct
10 Correct 1 ms 724 KB Output is correct
11 Correct 1 ms 736 KB Output is correct
12 Correct 1 ms 724 KB Output is correct
13 Correct 1 ms 732 KB Output is correct
14 Correct 1 ms 724 KB Output is correct
15 Correct 1 ms 736 KB Output is correct
16 Correct 1 ms 724 KB Output is correct
17 Correct 1 ms 724 KB Output is correct
18 Correct 1 ms 724 KB Output is correct
19 Correct 1 ms 724 KB Output is correct
20 Correct 2 ms 736 KB Output is correct
21 Correct 1 ms 604 KB Output is correct
22 Correct 1 ms 608 KB Output is correct
23 Correct 1 ms 596 KB Output is correct
24 Correct 1 ms 596 KB Output is correct
25 Correct 1 ms 596 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 596 KB Output is correct
2 Correct 1 ms 596 KB Output is correct
3 Correct 1 ms 604 KB Output is correct
4 Correct 1 ms 604 KB Output is correct
5 Correct 1 ms 596 KB Output is correct
6 Correct 1 ms 596 KB Output is correct
7 Correct 1 ms 724 KB Output is correct
8 Correct 1 ms 732 KB Output is correct
9 Correct 1 ms 724 KB Output is correct
10 Correct 1 ms 724 KB Output is correct
11 Correct 1 ms 736 KB Output is correct
12 Correct 1 ms 724 KB Output is correct
13 Correct 1 ms 732 KB Output is correct
14 Correct 1 ms 724 KB Output is correct
15 Correct 1 ms 736 KB Output is correct
16 Correct 1 ms 724 KB Output is correct
17 Correct 1 ms 724 KB Output is correct
18 Correct 1 ms 724 KB Output is correct
19 Correct 1 ms 724 KB Output is correct
20 Correct 2 ms 736 KB Output is correct
21 Correct 1 ms 604 KB Output is correct
22 Correct 1 ms 608 KB Output is correct
23 Correct 1 ms 596 KB Output is correct
24 Correct 1 ms 596 KB Output is correct
25 Correct 1 ms 596 KB Output is correct
26 Correct 2 ms 1364 KB Output is correct
27 Correct 427 ms 26204 KB Output is correct
28 Correct 448 ms 26312 KB Output is correct
29 Correct 605 ms 34212 KB Output is correct
30 Correct 584 ms 34264 KB Output is correct
31 Correct 529 ms 34180 KB Output is correct
32 Correct 555 ms 34144 KB Output is correct
33 Correct 603 ms 37240 KB Output is correct
34 Correct 628 ms 37456 KB Output is correct
35 Correct 493 ms 37168 KB Output is correct
36 Correct 528 ms 37196 KB Output is correct
37 Correct 607 ms 37232 KB Output is correct
38 Correct 606 ms 40664 KB Output is correct
39 Correct 597 ms 40556 KB Output is correct
40 Correct 627 ms 40736 KB Output is correct
41 Correct 586 ms 40624 KB Output is correct
42 Correct 519 ms 42736 KB Output is correct
43 Correct 589 ms 44528 KB Output is correct
44 Correct 603 ms 44584 KB Output is correct
45 Correct 485 ms 48896 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 596 KB Output is correct
2 Correct 1 ms 596 KB Output is correct
3 Correct 1 ms 604 KB Output is correct
4 Correct 1 ms 604 KB Output is correct
5 Correct 1 ms 596 KB Output is correct
6 Correct 1 ms 596 KB Output is correct
7 Correct 1 ms 724 KB Output is correct
8 Correct 1 ms 732 KB Output is correct
9 Correct 1 ms 724 KB Output is correct
10 Correct 1 ms 724 KB Output is correct
11 Correct 1 ms 736 KB Output is correct
12 Correct 1 ms 724 KB Output is correct
13 Correct 1 ms 732 KB Output is correct
14 Correct 1 ms 724 KB Output is correct
15 Correct 1 ms 736 KB Output is correct
16 Correct 1 ms 724 KB Output is correct
17 Correct 1 ms 724 KB Output is correct
18 Correct 1 ms 724 KB Output is correct
19 Correct 1 ms 724 KB Output is correct
20 Correct 2 ms 736 KB Output is correct
21 Correct 1 ms 604 KB Output is correct
22 Correct 1 ms 608 KB Output is correct
23 Correct 1 ms 596 KB Output is correct
24 Correct 1 ms 596 KB Output is correct
25 Correct 1 ms 596 KB Output is correct
26 Correct 2 ms 1364 KB Output is correct
27 Correct 427 ms 26204 KB Output is correct
28 Correct 448 ms 26312 KB Output is correct
29 Correct 605 ms 34212 KB Output is correct
30 Correct 584 ms 34264 KB Output is correct
31 Correct 529 ms 34180 KB Output is correct
32 Correct 555 ms 34144 KB Output is correct
33 Correct 603 ms 37240 KB Output is correct
34 Correct 628 ms 37456 KB Output is correct
35 Correct 493 ms 37168 KB Output is correct
36 Correct 528 ms 37196 KB Output is correct
37 Correct 607 ms 37232 KB Output is correct
38 Correct 606 ms 40664 KB Output is correct
39 Correct 597 ms 40556 KB Output is correct
40 Correct 627 ms 40736 KB Output is correct
41 Correct 586 ms 40624 KB Output is correct
42 Correct 519 ms 42736 KB Output is correct
43 Correct 589 ms 44528 KB Output is correct
44 Correct 603 ms 44584 KB Output is correct
45 Correct 485 ms 48896 KB Output is correct
46 Correct 260 ms 33612 KB Output is correct
47 Correct 3858 ms 383088 KB Output is correct
48 Correct 4384 ms 461964 KB Output is correct
49 Correct 4678 ms 524024 KB Output is correct
50 Correct 4596 ms 524060 KB Output is correct
51 Correct 4527 ms 524108 KB Output is correct
52 Correct 4875 ms 524316 KB Output is correct
53 Correct 4687 ms 524172 KB Output is correct
54 Correct 4787 ms 524244 KB Output is correct
55 Correct 4697 ms 524384 KB Output is correct
56 Correct 4824 ms 558272 KB Output is correct
57 Correct 4973 ms 593756 KB Output is correct
58 Correct 5097 ms 631596 KB Output is correct
59 Correct 5155 ms 671036 KB Output is correct
60 Correct 5267 ms 712312 KB Output is correct
61 Correct 5239 ms 755500 KB Output is correct
62 Correct 5165 ms 800564 KB Output is correct
63 Correct 4966 ms 843576 KB Output is correct
64 Correct 1953 ms 900836 KB Output is correct
65 Correct 1929 ms 900756 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 596 KB Output is correct
2 Correct 1 ms 596 KB Output is correct
3 Correct 1 ms 604 KB Output is correct
4 Correct 1 ms 604 KB Output is correct
5 Correct 1 ms 596 KB Output is correct
6 Correct 1 ms 596 KB Output is correct
7 Correct 1 ms 724 KB Output is correct
8 Correct 1 ms 732 KB Output is correct
9 Correct 1 ms 724 KB Output is correct
10 Correct 1 ms 724 KB Output is correct
11 Correct 1 ms 736 KB Output is correct
12 Correct 1 ms 724 KB Output is correct
13 Correct 1 ms 732 KB Output is correct
14 Correct 1 ms 724 KB Output is correct
15 Correct 1 ms 736 KB Output is correct
16 Correct 1 ms 724 KB Output is correct
17 Correct 1 ms 724 KB Output is correct
18 Correct 1 ms 724 KB Output is correct
19 Correct 1 ms 724 KB Output is correct
20 Correct 2 ms 736 KB Output is correct
21 Correct 1 ms 604 KB Output is correct
22 Correct 1 ms 608 KB Output is correct
23 Correct 1 ms 596 KB Output is correct
24 Correct 1 ms 596 KB Output is correct
25 Correct 1 ms 596 KB Output is correct
26 Correct 2 ms 1364 KB Output is correct
27 Correct 427 ms 26204 KB Output is correct
28 Correct 448 ms 26312 KB Output is correct
29 Correct 605 ms 34212 KB Output is correct
30 Correct 584 ms 34264 KB Output is correct
31 Correct 529 ms 34180 KB Output is correct
32 Correct 555 ms 34144 KB Output is correct
33 Correct 603 ms 37240 KB Output is correct
34 Correct 628 ms 37456 KB Output is correct
35 Correct 493 ms 37168 KB Output is correct
36 Correct 528 ms 37196 KB Output is correct
37 Correct 607 ms 37232 KB Output is correct
38 Correct 606 ms 40664 KB Output is correct
39 Correct 597 ms 40556 KB Output is correct
40 Correct 627 ms 40736 KB Output is correct
41 Correct 586 ms 40624 KB Output is correct
42 Correct 519 ms 42736 KB Output is correct
43 Correct 589 ms 44528 KB Output is correct
44 Correct 603 ms 44584 KB Output is correct
45 Correct 485 ms 48896 KB Output is correct
46 Correct 260 ms 33612 KB Output is correct
47 Correct 3858 ms 383088 KB Output is correct
48 Correct 4384 ms 461964 KB Output is correct
49 Correct 4678 ms 524024 KB Output is correct
50 Correct 4596 ms 524060 KB Output is correct
51 Correct 4527 ms 524108 KB Output is correct
52 Correct 4875 ms 524316 KB Output is correct
53 Correct 4687 ms 524172 KB Output is correct
54 Correct 4787 ms 524244 KB Output is correct
55 Correct 4697 ms 524384 KB Output is correct
56 Correct 4824 ms 558272 KB Output is correct
57 Correct 4973 ms 593756 KB Output is correct
58 Correct 5097 ms 631596 KB Output is correct
59 Correct 5155 ms 671036 KB Output is correct
60 Correct 5267 ms 712312 KB Output is correct
61 Correct 5239 ms 755500 KB Output is correct
62 Correct 5165 ms 800564 KB Output is correct
63 Correct 4966 ms 843576 KB Output is correct
64 Correct 1953 ms 900836 KB Output is correct
65 Correct 1929 ms 900756 KB Output is correct
66 Correct 517 ms 22396 KB Output is correct
67 Correct 664 ms 244636 KB Output is correct
68 Correct 1710 ms 879780 KB Output is correct
69 Correct 1985 ms 880308 KB Output is correct
70 Correct 2631 ms 901028 KB Output is correct
71 Correct 4385 ms 384520 KB Output is correct
72 Correct 4681 ms 463288 KB Output is correct
73 Correct 5361 ms 525880 KB Output is correct
74 Correct 5460 ms 525488 KB Output is correct
75 Correct 5404 ms 525664 KB Output is correct
76 Correct 5067 ms 525556 KB Output is correct
77 Correct 5013 ms 525760 KB Output is correct
78 Correct 4894 ms 525484 KB Output is correct
79 Correct 5708 ms 595324 KB Output is correct
80 Correct 5934 ms 632624 KB Output is correct
81 Correct 5501 ms 672176 KB Output is correct
82 Correct 5879 ms 713476 KB Output is correct
83 Correct 5623 ms 756668 KB Output is correct
84 Correct 5516 ms 845000 KB Output is correct
85 Correct 2438 ms 902436 KB Output is correct