제출 #1020792

#제출 시각아이디문제언어결과실행 시간메모리
1020792mansurRoller Coaster Railroad (IOI16_railroad)C++17
0 / 100
150 ms58052 KiB
#include "railroad.h" #include <bits/stdc++.h> using namespace std; #define rall(s) s.rbegin(), s.rend() #define all(s) s.begin(), s.end() #define sz(s) (int)s.size() #define s second #define f first using ll = long long; using pii = pair<int, int>; using pll = pair<ll, ll>; const ll inf = 1e18, N = 1e6; vector<int> ord, was(N), g[N]; void dfs(int u) { was[u] = 1; for (int to: g[u]) { if (!was[to]) dfs(to); } ord.push_back(u); } long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) { int n = sz(s); if (n <= 1) { ll dp[1 << n][n]; for (int msk = 0; msk < (1 << n); msk++) { for (int i = 0; i < n; i++) { dp[msk][i] = inf; } } for (int i = 0; i < n; i++) dp[1 << i][i] = 0; for (int msk = 1; msk < (1 << n); msk++) { for (int i = 0; i < n; i++) { if (msk >> i & 1) { for (int j = 0; j < n; j++) { if (msk >> j & 1) continue; int msk1 = msk + (1 << j); dp[msk1][j] = min(dp[msk1][j], dp[msk][i] + max(0, t[i] - s[j])); } } } } ll ans = inf; for (int i = 0; i < n; i++) ans = min(ans, dp[(1 << n) - 1][i]); return ans; } vector<pii> a; for (int i = 0; i < n; i++) a.push_back({t[i], s[i]}); sort(all(a)); for (int i = 0; i < n; i++) { g[i].push_back(i + n); if (i + 1 < n) g[i + n].push_back(i + n + 1); int l = 0, r = n - 1; while (l <= r) { int m = (l + r) / 2; if (a[m].f <= s[i]) l = m + 1; else r = m - 1; } l--; if (l >= 0) g[l + n].push_back(i); } for (int i = 0; i < n; i++) { if (!was[i]) dfs(i); } reverse(all(ord)); int lst = ord[0]; for (int i = 1; i < sz(ord); i++) { if (ord[i] >= n) continue; if (a[ord[i]].s < a[lst].f) return 0; lst = ord[i]; } return 1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...