Submission #1034770

#TimeUsernameProblemLanguageResultExecution timeMemory
1034770ArthuroWich곤돌라 (IOI14_gondola)C++17
100 / 100
39 ms5980 KiB
#include "gondola.h"
#include <bits/stdc++.h>
using namespace std;
int valid(int n, int gondolaSeq[]) {
    int mi = INT_MAX, ind = -1;
    set<int> c;
    for (int i = 0; i < n; i++) {
        c.insert(gondolaSeq[i]);
        if (mi > gondolaSeq[i]) {
            mi = gondolaSeq[i];
            ind = i;
        }
    }
    if (c.size() < n) {
        return 0;
    }
    if (mi > n) {
        return 1;
    }
    ind -= (mi-1);
    ind += n;
    ind %= n;
    vector<int> a;
    for (int i = ind; i < n; i++) {
        a.push_back(gondolaSeq[i]);
    }
    for (int i = 0; i < ind; i++) {
        a.push_back(gondolaSeq[i]);
    }
    for (int i = 0; i < n; i++) {
        if (a[i] <= n && a[i] != i+1) {
            return 0;
        }
    }
    return 1;
}
int replacement(int n, int gondolaSeq[], int replacementSeq[]) {
    int mi = INT_MAX, ind = -1, ma = 0;
    set<int> c;
    for (int i = 0; i < n; i++) {
        ma = max(ma, gondolaSeq[i]);
        c.insert(gondolaSeq[i]);
        if (mi > gondolaSeq[i]) {
            mi = gondolaSeq[i];
            ind = i;
        }
    }
    vector<pair<int, int>> num;
    if (ma <= n) {
        return 0;
    }
    if (mi > n) {
        for (int i = 0; i < n; i++) {
            num.push_back({gondolaSeq[i], i+1});
        }
        int l = 0;
        sort(num.begin(), num.end());
        l = num.back().first-n;
        for (int i = 0; i < l; i++) {
            replacementSeq[i] = num.back().second;
        }
        for (int i = 0; i < num.size(); i++) {
            replacementSeq[num[i].first-n-1] = num[i].second;
        }
        vector<int> ans(n+1, 0);
        for (int i = 1; i <= n; i++) {
            ans[i] = i;
        }
        for (int i = 0; i < l; i++) {
            int v = replacementSeq[i];
            replacementSeq[i] = ans[replacementSeq[i]];
            ans[v] = n+i+1;
        }
        return l;
    } else {
        ind -= (mi-1);
        ind += n;
        ind %= n;
        vector<int> a;
        for (int i = ind; i < n; i++) {
            a.push_back(gondolaSeq[i]);
        }
        for (int i = 0; i < ind; i++) {
            a.push_back(gondolaSeq[i]);
        }
        for (int i = 0; i < n; i++) {
            if (a[i] > n) {
               num.push_back({a[i], i+1});
            }
        }
        int l = 0;
        sort(num.begin(), num.end());
        l = num.back().first-n;
        for (int i = 0; i < l; i++) {
            replacementSeq[i] = num.back().second;
        }
        for (int i = 0; i < num.size(); i++) {
            replacementSeq[num[i].first-n-1] = num[i].second;
        }
        vector<int> ans(n+1, 0);
        for (int i = 1; i <= n; i++) {
            ans[i] = i;
        }
        for (int i = 0; i < l; i++) {
            int v = replacementSeq[i];
            replacementSeq[i] = ans[replacementSeq[i]];
            ans[v] = n+i+1;
        }
        return l;
    }
}
long long int binexp(long long int a, long long int b, long long int m) {
    long long int r = 1;
    while(b > 0) {
        if (b & 1) {
            b--;
            r *= a;
            r %= m;
        }
        b /= 2;
        a *= a;
        a %= m;
    }
    return r;
}
int countReplacement(int n, int gondolaSeq[]) {
    if (!valid(n, gondolaSeq)) {
        return 0;
    }
    vector<int> num;
    long long int ans = 1, mod = 1000000009;
    bool f = 0;
    for (int i = 0; i < n; i++) {
        if (gondolaSeq[i] > n) {
            num.push_back(gondolaSeq[i]);
        }
    }
    if (num.size() == n) {
        ans = num.size();
    }
    if (num.size() == 0) {
        return ans;
    }
    int v = num.size();
    num.push_back(n);
    sort(num.begin(), num.end());
    for (int i = 1; i < num.size(); i++) {
        ans *= binexp(v, num[i]-num[i-1]-1, mod);
        ans %= mod;
        v--;
    }
    return ans;
}

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:14:18: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   14 |     if (c.size() < n) {
      |         ~~~~~~~~~^~~
gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:62:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |         for (int i = 0; i < num.size(); i++) {
      |                         ~~^~~~~~~~~~~~
gondola.cpp:97:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   97 |         for (int i = 0; i < num.size(); i++) {
      |                         ~~^~~~~~~~~~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:138:20: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  138 |     if (num.size() == n) {
      |         ~~~~~~~~~~~^~~~
gondola.cpp:147:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  147 |     for (int i = 1; i < num.size(); i++) {
      |                     ~~^~~~~~~~~~~~
gondola.cpp:132:10: warning: unused variable 'f' [-Wunused-variable]
  132 |     bool f = 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...