제출 #414166

#제출 시각아이디문제언어결과실행 시간메모리
414166dxz05Gondola (IOI14_gondola)C++14
75 / 100
46 ms5676 KiB
#include "gondola.h"
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 3e5 + 2e2;

int a[MAXN];

int valid(int n, int inputSeq[]){
    for (int i = 0; i < 3 * n; i++) a[i] = inputSeq[i % n];

    set<int> s;
    for (int i = 0; i < n; i++) s.insert(a[i]);

    if (s.size() != n) return 0;

    int ind = -1;
    for (int i = n; i < 2 * n; i++){
        if (a[i] <= n){
            ind = i;
            break;
        }
    }

    if (ind == -1) return 1;

    for (int i = ind - a[ind] + 1; i <= ind - a[ind] + n; i++){
        if (a[i] > n) continue;
        if (a[i] - a[ind] != i - ind) return 0;
    }

    return 1;
}

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

int orig[MAXN];

int replacement(int n, int gondolaSeq[], int replacementSeq[]){
    for (int i = 0; i < n; i++){
        a[i] = gondolaSeq[i];
        orig[i] = i + 1;
    }

    for (int i = 0; i < n; i++){
        if (a[i] <= n){
            int ind = 1;
            for (int j = i - a[i] + 1; j <= i - a[i] + n; j++){
                orig[(j + n) % n] = ind++;
            }

            break;
        }
    }

    set<pair<int, int>> s;
    for (int i = 0; i < n; i++){
        s.insert(make_pair(a[i], orig[i]));
    }
    int last = n;

    int sz = 0;

    while (!s.empty()){
        int cur = s.begin()->second, need = s.begin()->first;
        s.erase(s.begin());

        if (cur == need) continue;

        replacementSeq[sz++] = cur;
        last++;

        while (last < need){
            replacementSeq[sz++] = last;
            last++;
        }

    }

    return sz;
}

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

long long powmod(int n, int k, int m){
    if (k == 0) return 1;
    long long x = powmod(n, k / 2, m);
    x = x * x % m;
    if (k % 2) x = x * n % m;
    return x;
}

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

    for (int i = 0; i < n; i++){
        a[i + 1] = inputSeq[i];
    }

    sort(a + 1, a + n + 1);

    if (a[n] == n) return 1;

    long long ans = 1, MOD = 1e9 + 9;

    if (a[1] > n) ans = n;

    for (int i = n; i >= 1; i--){
        int r = a[i] - 1, l = max(n + 1, a[i - 1] + 1);
        if (l <= r){
            ans *= powmod(n - i + 1, r - l + 1, MOD);
            ans %= MOD;
        }
    }

    return ans;
}

컴파일 시 표준 에러 (stderr) 메시지

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:16:18: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   16 |     if (s.size() != n) return 0;
      |         ~~~~~~~~~^~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...