Submission #500766

#TimeUsernameProblemLanguageResultExecution timeMemory
500766InternetPerson10Gondola (IOI14_gondola)C++17
100 / 100
27 ms3352 KiB
#include "gondola.h"
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const ll MOD = 1000000009;

int valid(int n, int inputSeq[]) {
    vector<int> nums(n);
    for(int i = 0; i < n; i++) {
        nums[i] = inputSeq[i];
    }
    sort(nums.begin(), nums.end());
    int mi = nums[n-1];
    for(int i = 0; i < n-1; i++) {
        if(nums[i] == nums[i+1]) return 0;
        mi = min(mi, nums[i]);
    }
    if(mi > n) return 1;
    int k = 0;
    for(int i = 0; i < n; i++) {
        if(mi == inputSeq[i]) k = i;
    }
    k -= mi;
    k += (n+1);
    k %= n;
    for(int i = 0; i < n; i++) {
        nums[i] = inputSeq[(k+i)%n];
    }
    for(int i = 0; i < n; i++) {
        if(nums[i] <= n && nums[i] != i+1) return 0;
    }
    return 1;
}

int replacement(int n, int gondolaSeq[], int replacementSeq[]) {
    vector<int> nums(n);
    int mi = MOD;
    for(int i = 0; i < n; i++) nums[i] = gondolaSeq[i];
    for(int i = 0; i < n; i++) {
        mi = min(mi, nums[i]);
    }
    ll k = 0;
    for(int i = 0; i < n; i++) {
        if(mi == gondolaSeq[i]) k = i;
    }
    k -= mi;
    k += (n+1);
    k += (ll)(mi) * (ll)(n);
    k %= n;
    for(int i = 0; i < n; i++) {
        nums[i] = gondolaSeq[(k+i)%n];
    }
    vector<pair<int, int>> v;
    for(int i = 0; i < n; i++) {
        v.push_back({nums[i], i+1});
    }
    sort(v.begin(), v.end());
    int g = 0;
    for(int i = 0; i < v.size(); i++) {
        while(v[i].second != v[i].first) {
            replacementSeq[g] = v[i].second;
            v[i].second = g+n+1;
            g++;
        }
    }
    return g;
}

ll modpow(ll n, ll e) {
    if(e == 0) return 1;
    ll x = modpow(n, e/2);
    x *= x;
    x %= MOD;
    if(e%2) {
        x *= n;
        x %= MOD;
    }
    return x;
}

int countReplacement(int n, int inputSeq[]) {
    if(!valid(n, inputSeq)) return 0;
    vector<int> nums(n);
    int mi = MOD;
    for(int i = 0; i < n; i++) nums[i] = inputSeq[i];
    for(int i = 0; i < n; i++) {
        mi = min(mi, nums[i]);
    }
    ll k = 0;
    for(int i = 0; i < n; i++) {
        if(mi == inputSeq[i]) k = i;
    }
    k -= mi;
    k += (n+1);
    k += (ll)(mi) * (ll)(n);
    k %= n;
    for(int i = 0; i < n; i++) {
        nums[i] = inputSeq[(k+i)%n];
    }
    vector<pair<int, int>> v;
    for(int i = 0; i < n; i++) {
        v.push_back({nums[i], i+1});
    }
    sort(v.begin(), v.end());
    ll ans = 1;
    if(mi > n) ans = n;
    int g = 0;
    for(int i = 0; i < v.size(); i++) {
        if(v[i].first == v[i].second) continue;
        v[i].second = g+n+1;
        ans *= modpow(v.size() - i, v[i].first - v[i].second);
        ans %= MOD;
        g = v[i].first-n;
    }
    return ans;
}

Compilation message (stderr)

gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:61:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   61 |     for(int i = 0; i < v.size(); i++) {
      |                    ~~^~~~~~~~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:110:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  110 |     for(int i = 0; i < v.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...