Submission #171168

#TimeUsernameProblemLanguageResultExecution timeMemory
171168AlexLuchianovRail (IOI14_rail)C++14
100 / 100
156 ms2812 KiB
#include "rail.h"
#include <map>
#include <vector>
#include <algorithm>
#include <iostream>
#include <fstream>

std::ofstream out ("data.out");

using ll = long long;
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) < (b)) ? (b) : (a))

int const nmax = 5000;
int const inf = 1000000000;

std::map<std::pair<int,int>, int> cost;

int getcost(int x, int y){
  if(cost.find({x, y}) == cost.end())
    cost[{y, x}] = cost[{x, y}] = getDistance(x, y);
  return cost[{x, y}];
}

struct Train{
  int id;
  int dist;
  bool operator < (Train const &a) const{
    return dist < a.dist;
  }
};

std::map<int,char> type;

int mark[1 + nmax];

void findLocation(int N, int first, int location[], int stype[])
{
  int pos = 1;
  for(int i = 1;i < N; i++)
    if(getcost(0, i) < getcost(0, pos))
      pos = i;
  location[0] = first;
  stype[0] = 1;
  type[location[0]] = 'C';
  location[pos] = first + getcost(0, pos);
  stype[pos] = 2;
  type[location[pos]] = 'D';

  std::vector<Train> v;
  for(int i = 1; i < N; i++)
    if(i != pos)
      v.push_back({i, getcost(0, i)});
  std::sort(v.begin(), v.end());

  int last1 = 0, last2 = pos;

  for(int i = 0; i < v.size(); i++){
    int id = v[i].id;
    if(getcost(0, pos) + getcost(pos, id) != getcost(0, id)){
      int x = location[last2] - getcost(last2, id);
      int y = (getcost(0, id) + x + location[0]) / 2;
      if(getcost(0, id) == (2 * y - location[0] - x) && type[y] == 'D'){
        location[id] = x;
        stype[id] = 1;
        type[location[id]] = 'C';
      } else {
        location[id] = location[0] + getcost(0, id);
        stype[id] = 2;
        type[location[id]] = 'D';
      }
      mark[id] = 1;
    } else {
      int x = location[last1] + getcost(last1, id);
      int y = (x + location[pos] - getcost(pos, id)) / 2;
      if(getcost(pos, id) == (x + location[pos] - 2 * y) && type[y] == 'C'){
        location[id] = x;
        stype[id] = 2;
        type[location[id]] = 'D';
      } else {
        location[id] = location[pos] - getcost(pos, id);
        stype[id] = 1;
        type[location[id]] = 'C';
      }
      mark[id] = 2;
    }

    if(stype[id] == 2 && location[last2] < location[id])
      last2 = id;
    if(stype[id] == 1 && location[id] < location[last1])
      last1 = id;
    //std::cout << id << " " << location[id] << " " << stype[id] << '\n';
  }
  //std::cout << '\n';
  //*

  //std::cout << 0 << " " << location[0] << '\n';
  //std::cout << pos << " " << location[pos] << '\n';
  /*
  for(int i = 0; i < N; i++)
    out << stype[i] << " " << location[i] << " " << mark[i] << " " << getcost(0, i) << " " << getcost(pos, i) <<  '\n';
  //*/
}

/*
1
5
1 1
1 2
2 6
2 7
2 8
*/

Compilation message (stderr)

rail.cpp: In function 'void findLocation(int, int, int*, int*)':
rail.cpp:58:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < v.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...