Submission #316186

#TimeUsernameProblemLanguageResultExecution timeMemory
316186qpwoeirutGondola (IOI14_gondola)C++17
75 / 100
389 ms3300 KiB
#include <bits/stdc++.h>
#include "gondola.h"

using namespace std;

typedef long long ll;

const int MN = 250001;
const ll MOD = 1e9 + 9;

bool normalize(int n, int seq[]) {
    for (int i=0; i<n; ++i) {
        if (seq[i] <= n) {
            int val = seq[i];
            int idx = (n + i - val + 1) % n;
            rotate(seq, seq+idx, seq+n);
            return true;
        }
    }
    return false;
}

bool seen[MN];
int valid(int n, int inputSeq[]) {
    fill(seen, seen+n, false);
    normalize(n, inputSeq);
    for (int i=0; i<n; ++i) { cerr << inputSeq[i] << ' '; } cerr << endl;

    for (int i=0; i<n; ++i) {
        if (inputSeq[i] != i+1 && inputSeq[i] <= n) {
            return 0;
        }
        if (seen[inputSeq[i]]) {
            return 0;
        }
        seen[inputSeq[i]] = true;
    }

    return 1;
}

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

int pos[MN];
pair<int,int> process(int n, int seq[]) {
    int mxv = 0;
    int mxi = -1;
    for (int i=0; i<n; ++i) {
        pos[seq[i]] = i;
        seen[seq[i]] = true;
        if (mxv < seq[i]) {
            mxv = seq[i];
            mxi = i;
        }
    }
    return pair<int,int>(mxv, mxi);
}

int replacement(int n, int gondolaSeq[], int replacementSeq[]) {
    fill(seen, seen+n, false);
    normalize(n, gondolaSeq);

    auto mx = process(n, gondolaSeq);
    int mxv = mx.first;
    int cur = mx.second + 1;

    int idx = 0;
    for (int i=n+1; i<=mxv; ++i) {
        if (!seen[i] || i == mxv) {
            replacementSeq[idx++] = cur;
            cur = i;
        } else {
            replacementSeq[idx++] = pos[i] + 1;
        }
    }

    return idx;
}

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

int BIT[MN];
int query(int i) {
    int ret = 0;
    for (; i>0; i-=(i&-i)) ret += BIT[i];
    return ret;
}
void inc(int i) {
    for (; i<MN; i+=(i&-i)) ++BIT[i];
}
int countReplacement(int n, int inputSeq[]) {
    bool rotated = normalize(n, inputSeq);
    if (!valid(n, inputSeq)) {
        return 0;
    }

    int mxv = process(n, inputSeq).first;
    for (int i=0; i<n; ++i) {
        inc(inputSeq[i]);
    }

    ll ans = 1;
    for (int i=n+1; i<=mxv; ++i) {
        if (seen[i]) continue;
        ll more = n - query(i);
        ans = (ans * more) % MOD;
    }

    return ans;
}

Compilation message (stderr)

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:92:10: warning: unused variable 'rotated' [-Wunused-variable]
   92 |     bool rotated = normalize(n, inputSeq);
      |          ^~~~~~~
#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...