제출 #815497

#제출 시각아이디문제언어결과실행 시간메모리
815497alexander707070전선 연결 (IOI17_wiring)C++14
17 / 100
1083 ms16300 KiB
#include<bits/stdc++.h> #define MAXN 200007 using namespace std; const long long inf=1e17; int n,m,last[2],start; pair<long long,int> p[MAXN]; long long dp[MAXN]; int pref[MAXN][2]; long long sum[MAXN][2]; int pr[MAXN][2],nxt[MAXN][2]; long long cnt(int l,int r,int id){ return pref[r][id]-pref[l-1][id]; } long long getsum(int l,int r,int id){ return sum[r][id]-sum[l-1][id]; } long long cost(int l,int r){ if(p[l].second==0 and p[r].second==1){ if(cnt(l,r,0)<=cnt(l,r,1)){ return getsum(l,r,1) - ( getsum(l,r,0) + (cnt(l,r,1)-cnt(l,r,0))*p[pr[r][0]].first ); }else{ return getsum(l,r,1) + (cnt(l,r,0)-cnt(l,r,1))*p[nxt[l][1]].first - getsum(l,r,0); } }else{ if(cnt(l,r,0)<=cnt(l,r,1)){ return getsum(l,r,0) + (cnt(l,r,1)-cnt(l,r,0))*p[nxt[l][0]].first - getsum(l,r,1); }else{ return getsum(l,r,0) - ( (cnt(l,r,0)-cnt(l,r,1))*p[pr[r][1]].first + getsum(l,r,1) ); } } } bool ok(int l,int r){ if(p[l].second==p[r].second)return false; if(p[l].second==0){ return nxt[l][1]-1==pr[r][0]; }else{ return nxt[l][0]-1==pr[r][1]; } } void precalc(){ for(int i=1;i<=n+m;i++){ if(p[i].second==0){ pref[i][0]++; sum[i][0]+=p[i].first; }else{ pref[i][1]++; sum[i][1]+=p[i].first; } pref[i][0]+=pref[i-1][0]; pref[i][1]+=pref[i-1][1]; sum[i][0]+=sum[i-1][0]; sum[i][1]+=sum[i-1][1]; } last[0]=last[1]=0; for(int i=1;i<=n+m;i++){ pr[i][0]=last[0]; pr[i][1]=last[1]; if(p[i].second==0)last[0]=i; else last[1]=i; } last[0]=last[1]=n+m+1; for(int i=n+m;i>=1;i--){ nxt[i][0]=last[0]; nxt[i][1]=last[1]; if(p[i].second==0)last[0]=i; else last[1]=i; } } long long min_total_length(vector<int> r,vector<int> b){ n=int(r.size()); m=int(b.size()); for(int i=0;i<r.size();i++){ p[i+1]={r[i],0}; } for(int i=0;i<b.size();i++){ p[r.size()+i+1]={b[i],1}; } sort(p+1,p+n+m+1); precalc(); for(int i=1;i<=n+m;i++){ if(p[i].second==0)start=pr[i][1]; else start=pr[i][0]; dp[i]=inf; for(int f=start;f>=1;f--){ if(!ok(f,i))break; dp[i]=min(dp[i],dp[f-1]+cost(f,i)); dp[i]=min(dp[i],dp[f]+cost(f,i)); } } return dp[n+m]; } /* int main(){ cout<<min_total_length({1, 2, 3, 7}, {0, 4, 5, 9, 10})<<"\n"; } */

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

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