답안 #1088604

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1088604 2024-09-14T16:33:23 Z T0p_ 곤돌라 (IOI14_gondola) C++14
60 / 100
17 ms 2772 KB
#include "gondola.h"
#include <bits/stdc++.h>

#define mod 1000000009

using namespace std;

int valid(int n, int inputSeq[]) {
  set<int> st;
  vector<pair<int, int>> v;

  for (int i=0 ; i<n ; i++) {
    if (inputSeq[i] <= n) {
      v.push_back({ inputSeq[i], i });
    }
    else {
      if (st.find(inputSeq[i]) != st.end()) {
        return 0;
      }

      st.insert(inputSeq[i]);
    }
  }

  sort(v.begin(), v.end());
  
  int sz_v = v.size();
  for (int i=0 ; i<sz_v-1 ; i++) {
    if (v[i].first == v[i+1].first) {
      return 0;
    }
    if ((v[i].second + v[i+1].first - v[i].first) % n != v[i+1].second) {
      return 0;
    }
  }

  return 1;
}

//----------------------

int replacement(int n, int gondolaSeq[], int replacementSeq[]) {
  int l = 0, start = -1;
  vector<pair<int, int>> v;

  for (int i=0 ; i<n ; i++) {
    if (gondolaSeq[i] <= n) {
      start = i;
      break;
    }
  }

  if (start != -1) {
    int val = gondolaSeq[start] == n ? 1 : gondolaSeq[start] + 1;
    for (int i=start+1 ; i<n ; i++) {
      if (gondolaSeq[i] > n) {
        v.push_back({ val, gondolaSeq[i] });
      }

      val = val == n ? 1 : val + 1;
    }
    for (int i=0 ; i<start ; i++) {
      if (gondolaSeq[i] > n) {
        v.push_back({ val, gondolaSeq[i] });
      }

      val = val == n ? 1 : val + 1;
    }
  }
  else {
    for (int i=0 ; i<n ; i++) {
      v.push_back({ i+1, gondolaSeq[i] });
    }
  }

  sort(v.begin(), v.end(), [](pair<int, int> a, pair<int, int> b) {
    return a.second < b.second;
  });
 
  int next = n + 1;
  for (pair<int, int> x : v) {
    int cur = x.first, tar = x.second;
 
    while (cur != tar) {
      replacementSeq[l++] = cur;
      cur = next++;
    }
  }
 
  return l;
}

//----------------------

int mop (int a, int b) {
  int res = 1;

  while (b) {
    if (b&1) {
      res = (res * a) % mod;
    }

    b >>= 1;
    a = (a * a) % mod;
  }

  return res;
}

int countReplacement(int n, int inputSeq[]) {
  if (!valid(n, inputSeq)) {
    return 0;
  }

  int start = -1;
  vector<pair<int, int>> v;

  for (int i=0 ; i<n ; i++) {
    if (inputSeq[i] <= n) {
      start = i;
      break;
    }
  }

  if (start != -1) {
    int val = inputSeq[start] == n ? 1 : inputSeq[start] + 1;
    for (int i=start+1 ; i<n ; i++) {
      if (inputSeq[i] > n) {
        v.push_back({ val, inputSeq[i] });
      }

      val = val == n ? 1 : val + 1;
    }
    for (int i=0 ; i<start ; i++) {
      if (inputSeq[i] > n) {
        v.push_back({ val, inputSeq[i] });
      }

      val = val == n ? 1 : val + 1;
    }
  }
  else {
    for (int i=0 ; i<n ; i++) {
      v.push_back({ i+1, inputSeq[i] });
    }
  }

  sort(v.begin(), v.end(), [](pair<int, int> a, pair<int, int> b) {
    return a.second < b.second;
  });

  int k = v.size();

  if (k == 0) {
    return 1;
  }
  
  int ans = mop(k, v[0].second - n - 1);

  for (int i=1 ; i<k ; i++) {
    ans *= mop(k-i, v[i].second - v[i-1].second - 1);
    ans %= mod;
  }

  if (start == -1) {
    ans *= n;
    ans %= mod;
  }

  return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 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
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 600 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 5 ms 1240 KB Output is correct
7 Correct 12 ms 2260 KB Output is correct
8 Correct 8 ms 2260 KB Output is correct
9 Correct 4 ms 860 KB Output is correct
10 Correct 13 ms 2260 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 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 440 KB Output is correct
6 Correct 5 ms 1252 KB Output is correct
7 Correct 13 ms 2260 KB Output is correct
8 Correct 10 ms 2260 KB Output is correct
9 Correct 4 ms 860 KB Output is correct
10 Correct 12 ms 2260 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 11 ms 2432 KB Output is correct
14 Correct 0 ms 348 KB Output is correct
15 Correct 17 ms 2772 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 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 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 360 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 1 ms 344 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 344 KB Output is correct
3 Correct 1 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 0 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 1 ms 344 KB Output is correct
10 Correct 1 ms 344 KB Output is correct
11 Correct 5 ms 1076 KB Output is correct
12 Correct 7 ms 1116 KB Output is correct
13 Correct 9 ms 1260 KB Output is correct
14 Correct 5 ms 1116 KB Output is correct
15 Correct 15 ms 2296 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 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 344 KB Output is correct
7 Incorrect 0 ms 344 KB Integer -841481820 violates the range [0, 1000000008]
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Incorrect 0 ms 348 KB Integer -841481820 violates the range [0, 1000000008]
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Incorrect 1 ms 348 KB Integer -841481820 violates the range [0, 1000000008]
8 Halted 0 ms 0 KB -