제출 #71889

#제출 시각아이디문제언어결과실행 시간메모리
71889zetapi전선 연결 (IOI17_wiring)C++14
100 / 100
97 ms76020 KiB
//#include <wiring.h> #include <bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define ll long long #define itr ::iterator typedef pair<ll,ll> pii; const ll MAX=3e5; const ll INF=1e17; vector<pii> vec,blocks; ll arr[MAX],dp[MAX],Min[MAX],Max[MAX]; void relax(int idx) { ll cur=0; for(int A=blocks[idx].second;A>=blocks[idx].first;A--) { cur+=arr[blocks[idx].second]-arr[A]; Min[A]=min(dp[A],dp[A-1])+cur; Max[A]=min(dp[A],dp[A-1])+cur+(blocks[idx].second-A+1)*(arr[blocks[idx+1].first]-arr[blocks[idx].second]); assert(Min[A]>=0); assert(Max[A]>=0); } for(int A=blocks[idx].second-1;A>=blocks[idx].first;A--) Min[A]=min(Min[A],Min[A+1]); for(int A=blocks[idx].first+1;A<=blocks[idx].second;A++) Max[A]=min(Max[A],Max[A-1]); return ; } ll min_total_length(vector<int> r={1,2,3,7},vector<int> b={0,4,5,9,10}) { for(int A=0;A<r.size();A++) vec.pb(mp(r[A],0)); for(int A=0;A<b.size();A++) vec.pb(mp(b[A],1)); sort(vec.begin(),vec.end()); for(int A=0;A<vec.size();A++) arr[A+1]=vec[A].first; ll cur=0; for(int A=1;A<vec.size();A++) { if(vec[A].second!=vec[A-1].second) { blocks.pb(mp(cur+1,A-1+1)); cur=A; } } blocks.pb(mp(cur+1,vec.size()-1+1)); /*for(auto A:blocks) cout<<A.first<<" "<<A.second<<"\n";*/ cur=0; for(int A=blocks[0].first;A<=blocks[0].second;A++) { dp[A]=INF; cur+=arr[blocks[0].second]-arr[A]; } for(int A=blocks[1].first;A<=blocks[1].second;A++) { cur+=arr[A]-arr[blocks[1].first]; dp[A]=cur+max(A-blocks[1].first+1,blocks[0].second-blocks[0].first+1)*(arr[blocks[1].first]-arr[blocks[0].second]); } for(int A=2;A<blocks.size();A++) { relax(A-1); cur=0; for(int B=blocks[A].first;B<=blocks[A].second;B++) { dp[B]=INF; cur+=arr[B]-arr[blocks[A].first]; ll actual=B-blocks[A].first,C=blocks[A-1].second-actual; if(blocks[A-1].second-actual>=blocks[A-1].first) { dp[B]=min(dp[B],cur+Max[C]); dp[B]=min(dp[B],cur+Min[C]+(arr[blocks[A].first]-arr[blocks[A-1].second])*(actual+1)); } else dp[B]=min(dp[B],cur+Min[blocks[A-1].first]+(arr[blocks[A].first]-arr[blocks[A-1].second])*(actual+1)); } } return dp[vec.size()]; } /*signed main() { ios_base::sync_with_stdio(false); cout<<min_total_length(); return 0; }*/

컴파일 시 표준 에러 (stderr) 메시지

wiring.cpp: In function 'long long int min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:39:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int A=0;A<r.size();A++)
                ~^~~~~~~~~
wiring.cpp:41:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int A=0;A<b.size();A++)
                ~^~~~~~~~~
wiring.cpp:44:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int A=0;A<vec.size();A++)
                ~^~~~~~~~~~~
wiring.cpp:47:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int A=1;A<vec.size();A++)
                ~^~~~~~~~~~~
wiring.cpp:69:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int A=2;A<blocks.size();A++)
                ~^~~~~~~~~~~~~~
#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...