Submission #56090

#TimeUsernameProblemLanguageResultExecution timeMemory
56090BenqWiring (IOI17_wiring)C++14
100 / 100
193 ms72620 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef long double ld; typedef complex<ld> cd; typedef pair<int, int> pi; typedef pair<ll,ll> pl; typedef pair<ld,ld> pd; typedef vector<int> vi; typedef vector<ld> vd; typedef vector<ll> vl; typedef vector<pi> vpi; typedef vector<pl> vpl; typedef vector<cd> vcd; template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>; #define FOR(i, a, b) for (int i=a; i<(b); i++) #define F0R(i, a) for (int i=0; i<(a); i++) #define FORd(i,a,b) for (int i = (b)-1; i >= a; i--) #define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--) #define sz(x) (int)(x).size() #define mp make_pair #define pb push_back #define f first #define s second #define lb lower_bound #define ub upper_bound #define all(x) x.begin(), x.end() const int MOD = 1000000007; const ll INF = 1e18; const int MX = 100001; ll dp[200001]; set<int> S[2]; int getDist(pi x) { auto it = S[x.s^1].lb(x.f); int ret = MOD; if (it != S[x.s^1].end()) ret = min(ret,*it-x.f); if (it != S[x.s^1].begin()) ret = min(ret,x.f-*prev(it)); return ret; } ll min_total_length(vi a, vi b) { for (int i: a) S[0].insert(i); for (int i: b) S[1].insert(i); vpi v; F0R(i,sz(a)) v.pb({a[i],0}); F0R(i,sz(b)) v.pb({b[i],1}); sort(all(v)); ll csum = 0; int ind = -1; F0R(i,sz(v)) { dp[i+1] = dp[i]+getDist(v[i]); if (i && v[i].s != v[i-1].s) { csum = v[i].f-v[i-1].f; ind = i-1; } else if (ind > 0 && v[ind].s == v[ind-1].s) { ind --; csum += v[i].f-v[ind].f; } else ind = -1; if (ind != -1) dp[i+1] = min(dp[i+1],dp[ind]+csum); // cout << "HI " << i << " " << v[i].f << " " << v[i].s << " " << dp[i+1] << "\n"; } return dp[sz(v)]; }
#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...