Submission #588904

#TimeUsernameProblemLanguageResultExecution timeMemory
588904snasibov05Gondola (IOI14_gondola)C++14
100 / 100
47 ms6608 KiB
#include "gondola.h"
#include <bits/stdc++.h>

#define ll long long

using namespace std;

int valid(int n, int inputSeq[]){

    int mni = 0;
    set<int> st;
    for (int i = 0; i < n; ++i){
        st.insert(inputSeq[i]);
        if (inputSeq[i] < inputSeq[mni]) mni = i;
    }

    if (st.size() < n) return 0;
    if (inputSeq[mni] > n) return 1;


    int k = mni - 1, x = inputSeq[mni] - 1;
    while (x > 0) {
        if (k == -1) k = n-1;
        if (inputSeq[k] != x && inputSeq[k] <= n) return 0;
        inputSeq[k] = x;
        k--, x--;
    }

    k = mni + 1, x = inputSeq[mni] + 1;
    while (x <= n){
        if (k == n) k = 0;
        if (inputSeq[k] != x && inputSeq[k] <= n) return 0;
        inputSeq[k] = x;
        k++, x++;
    }

    return 1;

}

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

int replacement(int n, int gondolaSeq[], int replacementSeq[]){

    int mni = 0, mxi = 0;
    for (int i = 0; i < n; ++i){
        if (gondolaSeq[i] < gondolaSeq[mni]) mni = i;
        if (gondolaSeq[i] > gondolaSeq[mxi]) mxi = i;
    }

    if (gondolaSeq[mxi] <= n) return 0;

    vector<int> v(n);

    if (gondolaSeq[mni] <= n){
        v[mni] = gondolaSeq[mni];
        int k = mni - 1, x = gondolaSeq[mni] - 1;
        while (x > 0) {
            if (k == -1) k = n-1;
            v[k] = x;
            k--, x--;
        }

        k = mni + 1, x = gondolaSeq[mni] + 1;
        while (x <= n){
            if (k == n) k = 0;
            v[k] = x;
            k++, x++;
        }
    } else{
        for (int i = 0; i < n; ++i) v[i] = i+1;
    }

    vector<pair<int, int>> arr;
    for (int i = 0; i < n; ++i) {
        if (gondolaSeq[i] <= n) continue;
        arr.push_back({gondolaSeq[i], i});
    }

    sort(arr.begin(), arr.end());
    int l = 0;
    for (int i = 0; i < arr.size(); ++i){
        int k;
        if (i == 0) k = n+1;
        else k = arr[i-1].first + 1;

        while (k < arr[i].first) {
            replacementSeq[l] = v[mxi];
            v[mxi] = k;
            l++, k++;
        }

        replacementSeq[l] = v[arr[i].second];
        v[arr[i].second] = arr[i].first;
        l++;
    }

    return l;
}

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

ll binpow(ll n, ll p, ll m){
    if (p == 0) return 1;
    else if (p % 2 == 0) {
        ll k = binpow(n, p / 2, m);
        return k * k % m;
    } else{
        ll k = binpow(n, p-1, m);
        return k * n % m;
    }
}

int countReplacement(int n, int inputSeq[]){

    const int m = 1e9 + 9;
    ll ans = 1;

    int mni = 0;
    set<int> st;
    for (int i = 0; i < n; ++i){
        st.insert(inputSeq[i]);
        if (inputSeq[i] < inputSeq[mni]) mni = i;
    }

    if (st.size() < n) return 0;
    if (inputSeq[mni] > n) ans *= n;

    int k = mni - 1, x = inputSeq[mni] - 1;
    while (x > 0 && inputSeq[mni] <= n) {
        if (k == -1) k = n-1;
        if (inputSeq[k] != x && inputSeq[k] <= n) return 0;
        k--, x--;
    }
    k = mni + 1, x = inputSeq[mni] + 1;
    while (x <= n && inputSeq[mni] <= n){
        if (k == n) k = 0;
        if (inputSeq[k] != x && inputSeq[k] <= n) return 0;
        k++, x++;
    }

    vector<int> arr;
    for (int i = 0; i < n; ++i) {
        if (inputSeq[i] <= n) continue;
        arr.push_back(inputSeq[i]);
    }

    sort(arr.begin(), arr.end());
    for (int i = 0; i < arr.size(); ++i){
        int kk;
        if (i == 0) kk = n+1;
        else kk = arr[i-1] + 1;
        
        ans = ans * binpow(arr.size() - i, arr[i] - kk, m) % m;
    }

    return (int)ans;
}

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:17:19: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   17 |     if (st.size() < n) return 0;
      |         ~~~~~~~~~~^~~
gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:82:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |     for (int i = 0; i < arr.size(); ++i){
      |                     ~~^~~~~~~~~~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:126:19: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  126 |     if (st.size() < n) return 0;
      |         ~~~~~~~~~~^~~
gondola.cpp:149:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  149 |     for (int i = 0; i < arr.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...
#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...