제출 #1224090

#제출 시각아이디문제언어결과실행 시간메모리
1224090Gabriel나일강 (IOI24_nile)C++20
82 / 100
59 ms12868 KiB
#include "nile.h"
#include "bits/stdc++.h"
using namespace std;
struct Artefacto{
  long long Peso, a, b;
};
bool operator<(const Artefacto& a, const Artefacto& b){
  if(a.Peso < b.Peso) return 1;
  else if(a.Peso > b.Peso) return 0;
  else return a.a - a.b > b.a - b.b;
}
vector<Artefacto> Artefactos;
vector<long long> Representantes, Tama_os;
long long Respuesta_actual = 0;
void Crear(long long n){
  for(long long i = 0; i < n; i++){
    Representantes.push_back(i);
    Tama_os.push_back(1);
  }
}
long long Buscar(long long a){
  if(Representantes[a] == a) return a;
  Representantes[a] = Buscar(Representantes[a]);
  Tama_os[a] = Tama_os[Representantes[a]];
  return Representantes[a];
}
void Unir(long long a, long long b){
  a = Buscar(a);
  b = Buscar(b);
  if(a != b){
    long long ta = Tama_os[a], tb = Tama_os[b];
    Tama_os[a] += Tama_os[b];
    Representantes[b] = a;
    Tama_os[b] = Tama_os[a];
    if(ta % 2 == 1) ta++;
    if(tb % 2 == 1) tb++;
    Respuesta_actual -= ta;
    Respuesta_actual -= tb;
    Respuesta_actual += Tama_os[a] + (long long)(Tama_os[a] % 2 == 1);
  }
}
vector<long long> calculate_costs(vector<int> w, vector<int> a, vector<int> b, vector<int> e) {
  int n = a.size(), q = e.size();
  for(long long i = 0; i < n; i++){
    Artefacto Nuevo;
    Nuevo.Peso = w[i];
    Nuevo.a = a[i];
    Nuevo.b = b[i];
    Artefactos.push_back(Nuevo);
    Respuesta_actual += a[i];
  }
  sort(Artefactos.begin(), Artefactos.end());
  if(q <= 5){
    vector<long long> Retorno;
    for(auto E: e){
      vector< vector<long long> > PD(n + 1, vector<long long>(3, 2222222222222222));
      PD[n][0] = 0;
      for(long long i = n - 1; i > -1; i--){
        for(long long j = 0; j < 3; j++){
          if(j == 0) PD[i][j] = min(PD[i + 1][0] + Artefactos[i].a, PD[i + 1][1] + Artefactos[i].b);
          if(j == 1){
            if(i - j > -1 and abs(Artefactos[i].Peso - Artefactos[i - j].Peso) <= E) PD[i][j] = min(PD[i + 1][j + 1] + Artefactos[i].a, PD[i + 1][0] + Artefactos[i].b);
            else PD[i][j] = 2222222222222222;
          }
          if(j == 2){
            if(i - j > -1 and abs(Artefactos[i].Peso - Artefactos[i - j].Peso) <= E) PD[i][j] = PD[i + 1][0] + Artefactos[i].b;
            else PD[i][j] = 2222222222222222;
          }
        }
      }
      Retorno.push_back(PD[0][0]);
    }
    return Retorno;
  }
  vector< pair<long long, long long> > Consultas(q);
  vector< pair< long long, pair<long long, long long> > > Emparejador(n - 1);
  for(long long i = 0; i < q; i++) Consultas[i] = {e[i], i};
  for(long long i = 0; i < n - 1; i++) Emparejador[i] = {abs(Artefactos[i].Peso - Artefactos[i + 1].Peso), {i, i + 1}};
  Crear(n);
  vector<long long> Respuestas(q);
  sort(Consultas.begin(), Consultas.end());
  sort(Emparejador.begin(), Emparejador.end());
  long long i = 0;
  for(auto E: Consultas){
    while(i < Emparejador.size() and Emparejador[i].first <= E.first){
      Unir(Emparejador[i].second.first, Emparejador[i].second.second);
      i++;
    }
    Respuestas[E.second] = Respuesta_actual;
  }
  return Respuestas;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...