Submission #789951

#TimeUsernameProblemLanguageResultExecution timeMemory
789951fatemetmhrWiring (IOI17_wiring)C++17
100 / 100
42 ms8752 KiB
// ~ Be Name Khoda ~ // #include "wiring.h" #include <bits/stdc++.h> //#pragma GCC optimize ("O3") //#pragma GCC target("avx2") //#pragma GCC optimize("unroll-loops,Ofast") using namespace std; typedef long long ll; #define pb push_back #define mp make_pair #define all(x) x.begin(), x.end() #define fi first #define se second const int maxn = 1e6 + 10; const int maxn5 = 5e5 + 10; const int maxnt = 1.2e6 + 10; const int maxn3 = 1e3 + 10; const int mod = 1e9 + 7; const ll inf = 1e18; ll dp[2][maxn5], pre[maxn5], suf[maxn5], cost[maxn5]; vector <pair<ll, int>> av; void build(int ty, int n, ll dis){ pre[0] = dp[ty][0]; for(int i = 1; i <= n; i++) pre[i] = min(pre[i - 1], dp[ty][i] - dis * i); suf[n] = dp[ty][n]; for(int i = n - 1; i >= 0; i--) suf[i] = min(suf[i + 1], dp[ty][i]); /* cout << "in " << ty << ' ' << n << ' ' << dis << endl; for(int i = 0; i <= n; i++) cout << i << ' ' << pre[i] << ' ' << suf[i] << ' ' << dp[ty][i] << endl; */ } ll get_min(int x, int n, ll dis){ ll ans = pre[min(x, n)]; if(n >= x) ans = min(ans, suf[x] - dis * x); //cout << "getting min of " << x << ' ' << n << ' ' << dis << ' ' << ans << endl; return ans; } long long min_total_length(std::vector<int> r, std::vector<int> b){ for(int i = 0; i < r.size(); i++) av.pb({r[i], 0}); for(int i = 0; i < b.size(); i++) av.pb({b[i], 1}); sort(all(av)); int last = 0, n = 0; for(int i = 0; i < av.size(); i++){ if(av[i].se == av[last].se) continue; //cout << "ok " << i << ' ' << last << ' ' << n << endl; if(n == 0){ n = i - last; for(int j = 0; j < n; j++) dp[av[last].se][j] = inf; for(int j = last; j < i; j++) dp[av[last].se][n] += av[i].fi - av[j].fi; build(av[last].se, n, av[i].fi - av[i - 1].fi); last = i; continue; } int m = i - last; ll cur = 0; fill(cost, cost + m + 4, 0); for(int j = last; j <= i; j++){ cost[m - (j - last)] = cur; cur += av[j].fi - av[last - 1].fi; } //cout << cost[0] << endl; for(int j = 0; j < m; j++) dp[av[last].se][j] = get_min(m - j, n, av[last].fi - av[last - 1].fi) + cost[j]; dp[av[last].se][m] = dp[av[last].se ^ 1][0] + cost[m]; cur = 0; for(int j = i - 1; j >= last; j--){ cur += av[i].fi - av[j].fi; dp[av[last].se][m - (j - last)] += cur; } build(av[last].se, m, av[i].fi - av[i - 1].fi); n = m; last = i; } int i = av.size(); int m = i - last; ll cur = 0; for(int j = last; j <= i; j++){ cost[m - (j - last)] = cur; if(j < i) cur += av[j].fi - av[last - 1].fi; } for(int j = 0; j < 1; j++) dp[av[last].se][j] = get_min(m - j, n, av[last].fi - av[last - 1].fi) + cost[j]; return dp[av[last].se][0]; }

Compilation message (stderr)

wiring.cpp: In function 'long long int min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:55:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |  for(int i = 0; i < r.size(); i++)
      |                 ~~^~~~~~~~~~
wiring.cpp:57:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |  for(int i = 0; i < b.size(); i++)
      |                 ~~^~~~~~~~~~
wiring.cpp:61:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   61 |  for(int i = 0; i < av.size(); i++){
      |                 ~~^~~~~~~~~~~
#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...