제출 #118171

#제출 시각아이디문제언어결과실행 시간메모리
118171sealnot123전선 연결 (IOI17_wiring)C++14
100 / 100
197 ms23088 KiB
#include "wiring.h" //#include "grader.cpp" #include<bits/stdc++.h> #define x first #define y second #define pb push_back #define eb emplace_back #define all(a) (a).begin(),(a).end() #define SZ(a) (int)(a).size() using namespace std; typedef long long LL; typedef pair<LL,LL> PLL; typedef pair<int,int> PII; typedef double D; typedef long double LD; const int N = 200005; LL seg[2][4*N], dp[N], FF[N], ff[N], BB[N], bb[N], pos[N]; int col[N], last[N], cnt; int n; void add(LL val, int idx, int t, int l = 1, int r = n, int now = 1){ if(l==r){ seg[t][now] = val; return ; } int m = (l+r)>>1; if(idx <= m) add(val, idx, t, l, m, now<<1); else add(val, idx, t, m+1, r, now<<1|1); seg[t][now] = min(seg[t][now<<1], seg[t][now<<1|1]); } LL get(int ll, int rr, int t, int l = 1, int r = n, int now = 1){ if(ll > rr || l > rr || r < ll) return 1e18; if(l >= ll && r <= rr) return seg[t][now]; int m = (l+r)>>1; return min( get(ll, rr, t, l, m, now<<1), get(ll, rr, t, m+1, r, now<<1|1)); } long long min_total_length(vector<int> A, vector<int> B) { n = SZ(A) + SZ(B); int a, c, d, i, j, k, l = 0, r = 0; while(l < SZ(A) && r < SZ(B)){ if(A[l] < B[r]){ pos[++cnt] = A[l++]; }else{ pos[++cnt] = B[r++]; col[cnt] = 1; } } while(l < SZ(A)) pos[++cnt] = A[l++]; while(r < SZ(B)) pos[++cnt] = B[r++], col[cnt] = 1; last[1] = 1; for(i=2; i<=n; i++){ if(col[i] == col[i-1]) last[i] = last[i-1], FF[i] = FF[i-1], ff[i] = ff[i-1]; else last[i] = i; FF[i] += pos[i] - pos[last[i]-1]; ff[i] += pos[i] - pos[last[i]]; } l = n; for(i = n-1; i>0; i--){ if(col[i] != col[i+1]) l = i+1; else BB[i] = BB[i+1], bb[i] = bb[i+1]; BB[i] += pos[l] - pos[i]; bb[i] += pos[l-1] - pos[i]; } for(i = 1; i <= n; i++){ dp[i] = 1e18; // printf("xxxxxx%d %d : %d %lld %lld %lld %lld\n", pos[i], col[i], last[i], FF[i], ff[i], BB[i], bb[i]); if(last[i] != 1){ d = i-last[i]+1; l = last[last[i]-1]; // printf("##%d %d = %lld\n",max(l, last[i]-d), last[i]-1, get(max(l, last[i]-d), last[i]-1, 0)); dp[i] = min(dp[i], get(max(l, last[i]-d), last[i]-1, 0) + FF[i]); dp[i] = min(dp[i], get(l, last[i]-d-1, 1) + ff[i]); } // printf("=====%lld %lld\n", min(dp[i-1],dp[i]) + bb[i], min(dp[i-1],dp[i]) + BB[i]); add(min(dp[i-1],dp[i]) + bb[i], i, 0); add(min(dp[i-1],dp[i]) + BB[i], i, 1); // printf("i %d : %lld\n", i, dp[i]); } return dp[n]; } /* 4 5 1 2 3 7 0 4 5 9 10 3 2 1 3 5 2 4 */

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

wiring.cpp: In function 'long long int min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:38:9: warning: unused variable 'a' [-Wunused-variable]
     int a, c, d, i, j, k, l = 0, r = 0;
         ^
wiring.cpp:38:12: warning: unused variable 'c' [-Wunused-variable]
     int a, c, d, i, j, k, l = 0, r = 0;
            ^
wiring.cpp:38:21: warning: unused variable 'j' [-Wunused-variable]
     int a, c, d, i, j, k, l = 0, r = 0;
                     ^
wiring.cpp:38:24: warning: unused variable 'k' [-Wunused-variable]
     int a, c, d, i, j, k, l = 0, r = 0;
                        ^
#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...