답안 #958616

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
958616 2024-04-06T07:17:42 Z kilkuwu 철로 (IOI14_rail) C++17
100 / 100
56 ms 856 KB
#include "rail.h"
#include <bits/stdc++.h>

#ifdef LOCAL
#include "template\debug.hpp"
#else
#define dbg(...) ;
#define timer(...) ;
#endif

void findLocation(int N, int F, int pos[], int type[]) {
  std::vector<int> d0(N);
  d0[0] = 0;
  pos[0] = F;
  type[0] = 1;
  std::vector<int> ord(N - 1);
  for (int i = 1; i < N; i++) {
    d0[i] = getDistance(0, i);
    ord[i - 1] = i;
  }

  std::sort(ord.begin(), ord.end(), [&](int i, int j) {
    return d0[i] < d0[j];
  });

  int S = ord[0];
  type[S] = 2;
  pos[S] = pos[0] + d0[S];

  std::vector<int> dS(N);
  dS[0] = d0[S];

  std::vector<int> left, right;
  for (int i = 1; i < N; i++) {
    if (i == S) continue;
    int ds = getDistance(S, i);
    dS[i] = ds;

    if (d0[i] == d0[S] + ds) {
      int located = pos[S] - ds;
      if (located > pos[0]) {
        pos[i] = located;
        type[i] = 1;
      } else {
        left.push_back(i);
      }
    } else {
      right.push_back(i);
    }
  }

  if (left.size()) {
    std::sort(left.begin(), left.end(), [&](int i, int j) {
      return dS[i] < dS[j];
    });

    std::vector<int> open;
    int lo = left.front();
    left.erase(left.begin());
    open.push_back(lo);
    type[lo] = 1;
    pos[lo] = pos[S] - dS[lo];
    for (int i : left) {
      int dnow = getDistance(lo, i);

      bool found = 0;
      for (int j : open) {
        // these are the open brackets 
        // we see if it works or not 
        if (dS[i] == dS[j] + dnow - (pos[j] - pos[lo])) {
          found = true;
          type[i] = 2;
          pos[i] = pos[lo] + dnow;
          break;
        }
      }

      if (!found) {
        lo = i;
        type[i] = 1;
        pos[i] = pos[S] - dS[i];
        open.push_back(i);
      }
    }
  }

  if (right.size()) {
    std::sort(right.begin(), right.end(), [&](int i, int j) {
      return d0[i] < d0[j];
    });

    dbg(right);

    std::vector<int> open;
    int lo = right.front();
    right.erase(right.begin());
    open.push_back(lo);
    type[lo] = 2;
    pos[lo] = pos[0] + d0[lo];
    dbg(lo, type[lo], pos[lo]);
    for (int i : right) {
      int dnow = getDistance(lo, i);
      dbg(i, dnow);

      bool found = 0;
      for (int j : open) {
        dbg(pos[lo] - pos[j]);
        if (d0[i] == d0[j] + dnow - (pos[lo] - pos[j])) {
          found = true;
          type[i] = 1;
          pos[i] = pos[lo] - dnow;
          break;
        }
      }

      if (!found) {
        lo = i;
        type[i] = 2;
        pos[i] = pos[0] + d0[i];
        open.push_back(i);
      }
    }
  }
}

/*
 
4
10
1 3
2 4
1 1
2 2
1 5
2 6
1 7
1 8 
1 9 
2 10



 */

#ifdef LOCAL

/* This is sample grader for the contestant */
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>

typedef struct Station {
  int index;
  int type;
  int location;
  int L,R;
}STATION;
long long cnt;
static int S,SUBTASK;
static STATION stations[10004];

int cmp_fun_1(const void *a,const void *b)
{
	STATION c,d;
	c = *(STATION*)(a);
	d = *(STATION*)(b);
  	return c.location < d.location ? -1 : 1;
}

int cmp_fun_2(const void *a,const void *b)
{
	STATION c,d;
	c = *(STATION*)(a);
	d = *(STATION*)(b);
  	return c.index < d.index ? -1 : 1;
}

void now_I_want_to_getLR(){
  int now = stations[S-1].index,i;
  for(i=S-2;i>=0;i--){
    stations[i].R = now;
    if(stations[i].type==2)	now = stations[i].index;
  }
  now = stations[0].index;
  for(i=1;i<S;i++){
    stations[i].L = now;
    if(stations[i].type==1)	now = stations[i].index;
  }
}

int getDistance(int x,int y)
{
  cnt++;
  if(x==y)	return 0;
  if(x<0 || x>=S || y<0 || y>=S)    return -1;
  if(stations[x].location > stations[y].location){
  	int tmp = x;
	x = y;
	y = tmp;
  }
  int ret = 0;
  if(stations[x].type==1 && stations[y].type==1){
    ret = stations[stations[y].R].location-stations[x].location+stations[stations[y].R].location-stations[y].location;
  }else if(stations[x].type==1 && stations[y].type==2){
    ret = stations[y].location-stations[x].location;
  }else if(stations[x].type==2 && stations[y].type==2){
    ret = stations[x].location-stations[stations[x].L].location+stations[y].location-stations[stations[x].L].location;
  }else if(stations[x].type==2 && stations[y].type==1){
    ret = stations[x].location-stations[stations[x].L].location+stations[stations[y].R].location
      -stations[stations[x].L].location+stations[stations[y].R].location-stations[y].location;
  }
  return ret;
}


void getInput()
{
  int g;
  g = scanf("%d",&SUBTASK);
  g = scanf("%d",&S);
  int s;
  for (s = 0; s < S; s++) {
    int type, location;
    g = scanf(" %d %d",&type,&location);
    stations[s].index = s;
    stations[s].location = location;
    stations[s].type = type;
    stations[s].L = -1;
    stations[s].R = -1;
  }
  qsort(stations, S, sizeof(STATION), cmp_fun_1);
  now_I_want_to_getLR();
  qsort(stations, S, sizeof(STATION), cmp_fun_2);
}

int serverGetStationNumber()
{
  return S;
}

int serverGetSubtaskNumber()
{
  return SUBTASK;
}

int serverGetFirstStationLocation()
{
  return stations[0].location;
}

int main()
{
  int i;
  getInput();
  cnt = 0;
  
  int location[10005];
  int type[10005];
  int ok = 1;
  findLocation(S, serverGetFirstStationLocation(),location, type);
  if(SUBTASK==3 && cnt>S*(S-1))	ok = 0;
  if(SUBTASK==4 && cnt>3*(S-1))	ok = 0;
  
  
  for (i = 0; i < S; i++)
    if(type[i]!=stations[i].type || location[i]!=stations[i].location)
      ok = 0;
  if(ok==0)	printf("Incorrect");
  else	printf("Correct");
  return 0;
}
#endif
//
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 344 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 0 ms 344 KB Output is correct
6 Correct 0 ms 500 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 516 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 1 ms 500 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 49 ms 604 KB Output is correct
2 Correct 48 ms 604 KB Output is correct
3 Correct 49 ms 604 KB Output is correct
4 Correct 49 ms 604 KB Output is correct
5 Correct 51 ms 604 KB Output is correct
6 Correct 51 ms 604 KB Output is correct
7 Correct 49 ms 604 KB Output is correct
8 Correct 51 ms 804 KB Output is correct
9 Correct 50 ms 696 KB Output is correct
10 Correct 48 ms 856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 49 ms 608 KB Output is correct
2 Correct 48 ms 604 KB Output is correct
3 Correct 49 ms 600 KB Output is correct
4 Correct 49 ms 604 KB Output is correct
5 Correct 56 ms 604 KB Output is correct
6 Correct 52 ms 600 KB Output is correct
7 Correct 50 ms 692 KB Output is correct
8 Correct 48 ms 604 KB Output is correct
9 Correct 48 ms 604 KB Output is correct
10 Correct 49 ms 604 KB Output is correct
11 Correct 52 ms 604 KB Output is correct
12 Correct 51 ms 848 KB Output is correct
13 Correct 49 ms 600 KB Output is correct
14 Correct 49 ms 628 KB Output is correct
15 Correct 48 ms 600 KB Output is correct
16 Correct 53 ms 856 KB Output is correct
17 Correct 54 ms 644 KB Output is correct
18 Correct 49 ms 604 KB Output is correct
19 Correct 49 ms 604 KB Output is correct
20 Correct 49 ms 632 KB Output is correct