Submission #50275

#TimeUsernameProblemLanguageResultExecution timeMemory
50275tmwilliamlin168Wiring (IOI17_wiring)C++14
100 / 100
74 ms7676 KiB
#include "wiring.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int, int> #define fi first #define se second const int mxN=1e5; const ll INF=1e18; ll p[2*mxN], ps[2*mxN+1], dp[2*mxN+1], mn1[mxN+1]={INF}; ll min_total_length(vector<int> r, vector<int> b) { int n=r.size()+b.size(); vector<pii> cls; for(int i=0, ri=0, bi=0, lc=-1, cc; i<n; ++i, lc=cc) { if(ri>=r.size()||bi<b.size()&&b[bi]<r[ri]) { p[i]=b[bi++]; cc=0; } else { p[i]=r[ri++]; cc=1; } ps[i+1]=p[i]+ps[i]; if(cc!=lc) cls.push_back({i, i}); else ++cls.back().se; } for(int i=cls[0].fi; i<=cls[0].se; ++i) dp[i+1]=INF; for(int bi=0; bi<cls.size()-1; ++bi) { for(int i=0; i<=cls[bi].se-cls[bi].fi; ++i) mn1[i+1]=min(min(dp[i+cls[bi].fi], dp[cls[bi+1].fi])+(cls[bi].se-cls[bi].fi+1-i)*p[cls[bi+1].fi]+ps[cls[bi].fi+i], mn1[i]); ll mn2=INF; for(int i=0; i<=cls[bi+1].se-cls[bi+1].fi; ++i) { dp[i+cls[bi+1].fi+1]=mn2-(i+1)*p[cls[bi].se]; if(i<=cls[bi].se-cls[bi].fi) { dp[i+cls[bi+1].fi+1]=min(mn1[cls[bi].se-cls[bi].fi+1-i]-(i+1)*p[cls[bi+1].fi], dp[i+cls[bi+1].fi+1]); mn2=min(min(dp[cls[bi].se-i], dp[cls[bi+1].fi])+(i+1)*p[cls[bi].se]+ps[cls[bi].se-i], mn2); } dp[i+cls[bi+1].fi+1]+=ps[cls[bi+1].fi+i+1]-2*ps[cls[bi+1].fi]; } } return dp[n]; }

Compilation message (stderr)

wiring.cpp: In function 'long long int min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:18:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(ri>=r.size()||bi<b.size()&&b[bi]<r[ri]) {
      ~~^~~~~~~~~~
wiring.cpp:18:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(ri>=r.size()||bi<b.size()&&b[bi]<r[ri]) {
                    ~~^~~~~~~~~
wiring.cpp:18:31: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if(ri>=r.size()||bi<b.size()&&b[bi]<r[ri]) {
wiring.cpp:33:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int bi=0; bi<cls.size()-1; ++bi) {
                ~~^~~~~~~~~~~~~
#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...