Submission #297805

#TimeUsernameProblemLanguageResultExecution timeMemory
297805juckterGondola (IOI14_gondola)C++14
100 / 100
75 ms5112 KiB
#include "gondola.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int MAXV = 3e5 + 10;
const ll MOD = 1e9 + 9;

ll mpow(ll b, ll e) {
    ll res = 1;
    for(ll k = 1; k <= e; k *= 2) {
        if(k & e) res = (res * b) % MOD;
        b = (b * b) % MOD;
    }
    return res;
}

int valid(int n, int inputSeq[]) {
    set<int> seen;
    int rot = -1;
    for(int i = 0; i < n; i++) {
        if(seen.count(inputSeq[i]))
            return 0;
        seen.insert(inputSeq[i]);
        if(inputSeq[i] <= n) {
            int nr = (inputSeq[i] - i + n) % n;
            if(rot != -1 && rot != nr)
                return 0;
            rot = nr;
        }
    }
    return 1;
}

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

int replacement(int n, int gondolaSeq[], int replacementSeq[]) {
    if(*min_element(gondolaSeq, gondolaSeq + n) <= n) {
        int rot;

        for(int i = 0; i < n; i++)
            if(gondolaSeq[i] <= n)
                rot = (gondolaSeq[i] - i + n - 1) % n;

        rotate(gondolaSeq, gondolaSeq + (n - rot) % n, gondolaSeq + n);
    }
    //for(int i = 0; i < n; i++)
    //    cerr << gondolaSeq[i] << " ";
    //cerr << '\n';
    int mx = *max_element(gondolaSeq, gondolaSeq + n);
    int mpos = -1;
    vector<int> pos(300000);
    for(int i = 0; i < n; i++) {
        pos[gondolaSeq[i]] = i + 1;
        if(gondolaSeq[i] == mx)
            mpos = i;
    }
    int st = 0, len = mx - n;
    int pv = mpos + 1;
    for(int i = n + 1; i <= mx; i++) {
        if(i != mx && pos[i])
            replacementSeq[st++] = pos[i];
        else {
            replacementSeq[st++] = pv;
            pv = i;
        }
    }
    return len;
}

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

int countReplacement(int n, int inputSeq[]) {
    if(!valid(n, inputSeq))
        return 0;
    ll cntBig = 0;
    vector<ll> bigs;
    for(int i = 0; i < n; i++)
        if(inputSeq[i] > n) {
            cntBig++;
            bigs.push_back(inputSeq[i]);
        }

    ll cntSmall = n - cntBig;
    bigs.push_back(n);
    sort(bigs.begin(), bigs.end());
    ll ways = 1, cur = cntBig;
    for(int i = 1; i < bigs.size(); i++) {
        ways = (ways * mpow(cur, bigs[i] - bigs[i - 1] - 1)) % MOD;
        cur--;
    }

    if(cntBig == n)
        ways = (ways * (ll)n) % MOD;
    return ways;
}

Compilation message (stderr)

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:88:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   88 |     for(int i = 1; i < bigs.size(); i++) {
      |                    ~~^~~~~~~~~~~~~
gondola.cpp:84:8: warning: unused variable 'cntSmall' [-Wunused-variable]
   84 |     ll cntSmall = n - cntBig;
      |        ^~~~~~~~
gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:45:44: warning: 'rot' may be used uninitialized in this function [-Wmaybe-uninitialized]
   45 |         rotate(gondolaSeq, gondolaSeq + (n - rot) % n, gondolaSeq + n);
      |                                         ~~~^~~~~~
#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...