제출 #38942

#제출 시각아이디문제언어결과실행 시간메모리
38942moonrabbit2전선 연결 (IOI17_wiring)C++14
100 / 100
53 ms13744 KiB
#include "wiring.h" #include <bits/stdc++.h> #define N 200005 #define f first #define s second using namespace std; typedef long long ll; typedef pair<ll,int>P; int n,m,k; P c[N]; ll dp[N],diff[N],mdist[N]; int plc[N],appear[2*N],amt,p[2]; ll min_total_length(vector<int> a,vector<int> b) { n=a.size(),m=b.size(),k=n+m; for(int i=0,j=0;i+j<k;){ if(j>=m||i<n&&a[i]<b[j]){ c[i+j+1]={(ll)a[i],0}; i++; } else{ c[i+j+1]={(ll)b[j],1}; j++; } } for(int i=1;i<=k;i++) mdist[i]=1e9+10; p[0]=p[1]=0; for(int i=1;i<=k;i++){ if(p[!c[i].s]) mdist[i]=min(mdist[i],c[i].f-c[p[!c[i].s]].f); p[c[i].s]=i; } p[0]=p[1]=0; for(int i=k;i>=1;i--){ if(p[!c[i].s]) mdist[i]=min(mdist[i],c[p[!c[i].s]].f-c[i].f); p[c[i].s]=i; } for(int i=0;i<=2*k;i++) appear[i]=-1; appear[k]=0; for(int i=1;i<=k;i++){ plc[i]=-1; if(c[i].s){ amt++; diff[i]=diff[i-1]+c[i].f; } else{ amt--; diff[i]=diff[i-1]-c[i].f; } if(appear[amt+k]!=-1) plc[i]=appear[amt+k]; appear[amt+k]=i; } for(int i=1;i<=k;i++){ dp[i]=dp[i-1]+mdist[i]; if(plc[i]!=-1) dp[i]=min(dp[i],dp[plc[i]]+abs(diff[i]-diff[plc[i]])); } return dp[k]; }

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

wiring.cpp: In function 'll min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:16:21: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
         if(j>=m||i<n&&a[i]<b[j]){
                     ^
#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...