답안 #584778

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
584778 2022-06-28T02:54:46 Z jack715 곤돌라 (IOI14_gondola) C++14
100 / 100
18 ms 2264 KB
#include "gondola.h"
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define pp pop_back
#define mp make_pair
#define bb back
#define ff first
#define ss second

using namespace std;

void rotatek(vector<int>& nums, int k) {
  vector<int> cp = nums;
  int n = nums.size(); 
  for (int i = 0; i < n; i++)
    nums[i] = cp[(i+k)%n];
}

int valid(int n, int inputSeq[])
{
  vector<int> nums(n);
  for (int i = 0; i < n; i++) nums[i] = inputSeq[i];
  for (int i = 0; i < n; i++) {
    if (nums[i] <= n) {
      rotatek(nums, (i-nums[i]+1+n)%n);
      break;
    }
  }

  vector<int> rem;
  for (int i = 0; i < n; i++) {
    if (nums[i] <= n && nums[i] != i+1) return 0;
    if (nums[i] > n) rem.pb(nums[i]);
  }
  sort(rem.begin(), rem.end());
  for (int i = 1; i < rem.size(); i++) {
    if (rem[i] == rem[i-1]) return 0;
  }
  return 1;
}

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

int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
  vector<int> nums(n);
  vector<pair<int, int> > rem;

  for (int i = 0; i < n; i++) 
    nums[i] = gondolaSeq[i];  

  for (int i = 0; i < n; i++) {
    if (nums[i] <= n) {
      rotatek(nums, (i-nums[i]+1+n)%n);
      break;
    }
  }

  for (int i = 0; i < n; i++) {
    if (nums[i] > n) {
      rem.pb({nums[i], i+1});
    }
  }

  sort(rem.begin(), rem.end());
  int now, next = n+1, ans = 0;
  for (int i = 0; i < rem.size(); i++) {
    now = rem[i].ss;
    while (now < rem[i].ff) {
      replacementSeq[ans] = now;
      now = next, next++;
      ans++;
    }
  } 
  return ans;
}

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

ll modpow(ll a, ll b, int& MOD) {
  if (b == 0) return 1;
  ll now = modpow(a, b/2, MOD);
  now = (now*now) % MOD;
  if (b % 2) return (now*a)%MOD;
  return now;
}

int countReplacement(int n, int inputSeq[])
{
  int MOD = 1e9+9;
  vector<int> nums(n), rem;

  for (int i = 0; i < n; i++) 
    nums[i] = inputSeq[i];  

  for (int i = 0; i < n; i++) {
    if (nums[i] <= n) {
      rotatek(nums, (i-nums[i]+1+n)%n);
      break;
    }
  }

  for (int i = 0; i < n; i++) {
    if (nums[i] > n)  
      rem.pb(nums[i]);
    else {
      if (nums[i] != i+1)
        return 0;
    }
  }

  sort(rem.begin(), rem.end());
  int now = n+1, mult = rem.size();
  ll ans = 1;
  for (int i = 0; i < rem.size(); i++) {
    ans = (ans*modpow(mult, rem[i]-now, MOD))%MOD;
    now = rem[i]+1, mult--;
  }
  if (rem.size() == n)
    ans = (ans*n)%MOD;
  return ans;
}

/*
10
2 
3 4

9
4
4 7 4 7

8
7
2 3 4 12 6 7 1

7
4
1 2 7 6
*/

Compilation message

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:37:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   37 |   for (int i = 1; i < rem.size(); i++) {
      |                   ~~^~~~~~~~~~~~
gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:68:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |   for (int i = 0; i < rem.size(); i++) {
      |                   ~~^~~~~~~~~~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:116:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  116 |   for (int i = 0; i < rem.size(); i++) {
      |                   ~~^~~~~~~~~~~~
gondola.cpp:120:18: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  120 |   if (rem.size() == n)
      |       ~~~~~~~~~~~^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 3 ms 724 KB Output is correct
7 Correct 8 ms 1280 KB Output is correct
8 Correct 7 ms 1104 KB Output is correct
9 Correct 2 ms 468 KB Output is correct
10 Correct 7 ms 1236 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 4 ms 724 KB Output is correct
7 Correct 8 ms 1236 KB Output is correct
8 Correct 9 ms 1108 KB Output is correct
9 Correct 2 ms 468 KB Output is correct
10 Correct 8 ms 1236 KB Output is correct
11 Correct 0 ms 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 4 ms 832 KB Output is correct
14 Correct 1 ms 308 KB Output is correct
15 Correct 10 ms 1356 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 228 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 7 ms 1180 KB Output is correct
12 Correct 9 ms 1364 KB Output is correct
13 Correct 13 ms 1244 KB Output is correct
14 Correct 7 ms 1236 KB Output is correct
15 Correct 17 ms 2264 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 12 ms 1276 KB Output is correct
10 Correct 10 ms 1132 KB Output is correct
11 Correct 4 ms 596 KB Output is correct
12 Correct 5 ms 724 KB Output is correct
13 Correct 1 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 12 ms 1332 KB Output is correct
10 Correct 10 ms 1132 KB Output is correct
11 Correct 4 ms 596 KB Output is correct
12 Correct 5 ms 724 KB Output is correct
13 Correct 1 ms 340 KB Output is correct
14 Correct 16 ms 1584 KB Output is correct
15 Correct 18 ms 1696 KB Output is correct
16 Correct 4 ms 596 KB Output is correct
17 Correct 12 ms 1108 KB Output is correct
18 Correct 7 ms 980 KB Output is correct