Submission #390221

#TimeUsernameProblemLanguageResultExecution timeMemory
390221mehrdad_sohrabiWiring (IOI17_wiring)C++14
100 / 100
69 ms10176 KiB
#include <bits/stdc++.h> #include "wiring.h" /// 500 485 462 A4 using namespace std; typedef long long int ll; typedef complex<double> point; typedef long double ld; #define pb push_back #define pii pair < ll , ll > #define F first #define S second //#define endl '\n' #define int long long #define sync ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0) #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math") #define kill(x) return cout<<x<<'\n', 0; const int N=2e5+100,inf=(ll)1e15; ll dp[N]; ll par[N]; vector <pii> a; ll solve(ll l,ll r,ll L,ll R){ ll zz=0; if (l>0) zz=par[l-1]; ll ans=-(par[r]-zz)+par[R]-par[L-1]; ll z=r-l+1; ll t=R-L+1; if (z<t){ ans-=(t-z)*a[r].F; } else{ ans+=(z-t)*a[L].F; } return ans; } void devide(ll l,ll r,ll L,ll R,ll k){ if (r<l) return ; ll mid=(r+l)/2; ll id=L,mx=inf; for (int i=L;i<=R;i++){ ll z=solve(mid,k,k+1,i)+min(dp[i],dp[i+1]); if (z<=mx){ mx=z; id=i; } } dp[mid]=mx; devide(mid+1,r,L,id,k); devide(l,mid-1,id,R,k); } long long min_total_length(std::vector<int32_t> r, std::vector<int32_t> b) { for (auto u : r){ a.pb({u,0}); } for (auto u : b){ a.pb({u,1}); } sort(a.begin(),a.end()); par[0]=a[0].F; for (int i=1;i<a.size();i++){ par[i]=par[i-1]+a[i].F; } memset(dp,63,sizeof dp); dp[a.size()]=0; vector <int> best; for (int i=a.size()-2;i>-1;i--){ ll id=i; if (i>0 && a[i-1].S==a[i].S) continue; while(id<a.size() && a[id].S==a[i].S) id++; if (id==a.size()) continue; ll id2=id; while(id2<a.size() && a[id2].S==a[id].S) id2++; // cout << a[i].F << " " << i << " " << id << " " << id2 << endl; /* ll ww=i; for (int j=id;j<id2;j++){ // cout << i << " " << id-1 << " " << j << " " << solve(i,id-1,id,j) << endl; dp[i]=min(dp[i],solve(i,id-1,id,j)+min(dp[j],dp[j+1])); if (dp[i]==solve(i,id-1,id,j)+min(dp[j],dp[j+1])){ ww=j; } } best.pb(ww); */ // cout << i << " " << id-1 << " " << id+1 << " " << id2-1 << endl; devide(i,id-1,id,id2-1,id-1); // cout << i << " " << dp[i] << endl; } return dp[0]; } /* int32_t main() { int32_t n, m; assert(2 == scanf("%d %d", &n, &m)); vector<int32_t> r(n), b(m); for(int i = 0; i < n; i++) assert(1 == scanf("%d", &r[i])); for(int i = 0; i < m; i++) assert(1 == scanf("%d", &b[i])); long long res = min_total_length(r, b); printf("%lld\n", res); return 0; } */ /* 4 5 1 2 3 7 0 4 5 9 10 */

Compilation message (stderr)

wiring.cpp: In function 'long long int min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:59:16: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |  for (int i=1;i<a.size();i++){
      |               ~^~~~~~~~~
wiring.cpp:68:17: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |         while(id<a.size() && a[id].S==a[i].S) id++;
      |               ~~^~~~~~~~~
wiring.cpp:69:15: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |         if (id==a.size()) continue;
      |             ~~^~~~~~~~~~
wiring.cpp:71:18: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |         while(id2<a.size() && a[id2].S==a[id].S) id2++;
      |               ~~~^~~~~~~~~
#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...