Submission #289071

#TimeUsernameProblemLanguageResultExecution timeMemory
289071_7_7_Wiring (IOI17_wiring)C++14
100 / 100
113 ms9452 KiB
#include "wiring.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; //#define int long long //#pragma GCC optimize("Ofast") //#pragma comment(linker, "/stack:200000000") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4") #define file(s) freopen(s".in","r",stdin); freopen(s".out","w",stdout); #define fastio ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); #define all(x) x.begin(), x.end() #define sz(s) (int)s.size() #define pb push_back #define ppb pop_back #define mp make_pair #define s second #define f first typedef pair < long long, long long > pll; typedef pair < int, int > pii; typedef unsigned long long ull; typedef vector < pii > vpii; typedef vector < int > vi; typedef long double ldb; typedef long long ll; typedef double db; typedef tree < int, null_type, less < int >, rb_tree_tag, tree_order_statistics_node_update > ordered_set; const int inf = 1e9, maxn = 2e5 + 48, mod = 998244353, N = 2e5 + 11; const int dx[] = {-1, 0, 1, 0}, dy[] = {0, -1, 0, 1}, block = 300; const pii base = mp(1171, 3307), Mod = mp(1e9 + 7, 1e9 + 9); const db eps = 1e-12, pi = acos(-1); const ll INF = 1e18; int n, m, prv[N]; ll dp[N], s[N]; vpii V; ll get (int l, int r) { return s[r] - (!l ? 0 : s[l - 1]); } ll min_total_length(vi r, vi b) { n = sz(r), m = sz(b); for (auto x : r) V.pb(mp(x, 0)); for (auto x : b) V.pb(mp(x, 1)); sort(all(V)); memset(prv, -1, sizeof(prv)); for (int i = 0; i < sz(V); ++i) { s[i] = (!i ? 0 : s[i - 1]) + V[i].f; int j = i; while (j + 1 < sz(V) && V[i].s == V[j + 1].s) { ++j; s[j] = s[j - 1] + V[j].f; } for (int x = i; x <= j; ++x) { dp[x] = INF; if (i) { dp[x] = dp[x - 1] + V[x].f - V[i - 1].f; if (x == i) prv[x] = i - 1; else prv[x] = prv[x - 1] - 1; if (prv[x] >= 0 && V[x].s == V[prv[x]].s) prv[x] = -1; if (x == 1) cerr << prv[x] << endl; if (prv[x] >= 0) dp[x] = min(dp[x], (!prv[x] ? 0 : dp[prv[x] - 1]) + get(i, x) - get(prv[x], i - 1)); } if (j + 1 < sz(V)) dp[x] = min((!x ? 0 : dp[x - 1]) + V[j + 1].f - V[x].f, dp[x]); } i = j; } /* for (int i = 0; i < n + m; ++i) cerr << V[i].f << ' ' << V[i].s << endl; for (int i = 0; i < n + m; ++i) cerr << dp[i] << ' ';*/ return dp[n + m - 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...
#Verdict Execution timeMemoryGrader output
Fetching results...