제출 #767390

#제출 시각아이디문제언어결과실행 시간메모리
767390APROHACK전선 연결 (IOI17_wiring)C++14
30 / 100
1075 ms17956 KiB
#include "wiring.h" #include <bits/stdc++.h> #define pb push_back #define pos first #define color second #define ll long long using namespace std; vector<pair<ll, bool> >nodes; ll distNext[200001]; // Distancia de este nodo con el siguiente de otro color ll distanciaAcum[200005]; // distancia acumulada si tomo desde i y lo uno con el siguiente del otro color int siguiente[200005]; // siguiente del otro color int nm; ll mem[200005]; ll dp(int node){ int last; ll ret = 0; if(siguiente[node] == -1)return LLONG_MAX; if(mem[node] != -1)return mem[node]; if(siguiente[siguiente[node]] == -1){ // Tengo que unir este grupo con todos los de alla. last = nm-1; ret = distanciaAcum[node]; int numNodos = siguiente[node]-node; ll acum2 = 0, cuenta = 1; for(int i = siguiente[node] + 1 ; i <= last ; i ++){ cuenta ++; if(cuenta <= numNodos){ acum2 = nodes[i].pos-nodes[siguiente[node]].pos; ret += acum2; } else{ acum2 = nodes[i].pos - nodes[siguiente[node]-1].pos; ret += acum2 ; } } }else{ ret = distanciaAcum[node] + dp(siguiente[node]); if(dp(siguiente[node] +1) != LLONG_MAX){ ret = min(ret, distanciaAcum[node] + dp(siguiente[node]+1)); } int numNodos = siguiente[node]-node; ll acum2 = 0, cuenta = 1; for(int i = siguiente[node]+1 ; i < siguiente[siguiente[node]] ; i++){ cuenta ++; if(cuenta <= numNodos && dp(i+1) != LLONG_MAX){ acum2 += nodes[i].pos-nodes[siguiente[node]].pos; ret = min(ret, distanciaAcum[node] + acum2 + dp(i+1)); } else{ acum2 += nodes[i].pos - nodes[siguiente[node]-1].pos; if(dp(i+1) != LLONG_MAX){ ret = min(ret, distanciaAcum[node] + acum2 + dp(i+1)); } } } } return mem[node] = ret; } long long min_total_length(std::vector<int> r, std::vector<int> b) { memset(mem, -1, sizeof mem); int ir = r.size() -1, ib = 0; ll ans = 0; nm = r.size() + b.size(); for(auto i : r)nodes.pb({i, 0}); for(auto i : b)nodes.pb({i, 1}); sort(nodes.begin(), nodes.end()); ll last0 = -1, last1 = -1; int ultimo0 = -1, ultimo1 = -1; for(int i = nm-1 ; i >= 0 ; i --){ if(nodes[i].color == 0){ //cout << 0 << " "; if(last1-nodes[i].pos < 0){ distNext[i] = -1; }else{ distNext[i] = last1-nodes[i].pos; } last0 = nodes[i].pos; ultimo0 = i; siguiente[i] = ultimo1; }else{ //cout << 1 << " "; if(last0-nodes[i].pos < 0){ distNext[i] = -1; }else{ distNext[i] = last0-nodes[i].pos; } last1 = nodes[i].pos; ultimo1 = i; siguiente[i] = ultimo0; } } ll distCum[2]; distCum[0] = 0; distCum[1] = 0; for(int i = nm-1 ; i >= 0 ; i --){ if(distNext[i] != -1){ distCum[nodes[i].color] += distNext[i]; distanciaAcum[i] = distCum[nodes[i].color]; }else distanciaAcum[i] = -1; if(nodes[i].color == 0)distCum[1] = 0; else distCum[0] = 0; } //for(int i = 0 ; i < nm ; i ++)cout << dp(i) << endl; return dp(0); }

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

wiring.cpp: In function 'long long int min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:66:6: warning: unused variable 'ir' [-Wunused-variable]
   66 |  int ir = r.size() -1, ib = 0;
      |      ^~
wiring.cpp:66:24: warning: unused variable 'ib' [-Wunused-variable]
   66 |  int ir = r.size() -1, ib = 0;
      |                        ^~
wiring.cpp:67:5: warning: unused variable 'ans' [-Wunused-variable]
   67 |  ll ans = 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...