Submission #634811

#TimeUsernameProblemLanguageResultExecution timeMemory
634811PoonYaPatGondola (IOI14_gondola)C++14
30 / 100
9 ms736 KiB
#include "gondola.h"

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int mod=1000000009;
bool have[250001];
int head[250001];


int valid(int n, int s[]) {
    bool ans=true;
    int sc=0;

    for (int i=0; i<n; ++i) {
        if (have[s[i]]) return 0;
        have[s[i]]=true;
        if (s[i]<=n && sc==0) sc=i;
    }

    int val=s[sc];
    for (int i=sc+1; i<n; ++i) {
        ++val;
        if (val>n) val-=n;
        if (s[i]<=n && s[i]!=val) {
            ans=false;
            break;
        }
    }

    return ans;
}

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

int replacement(int n, int s[], int ans[]) {
    int mmax=0,hm,sc=0;
    bool fix=false;
    for (int i=0; i<n; ++i) {
        mmax=max(mmax,s[i]);
        if (s[i]<=n) {
            fix=true;
            if (sc==0) sc=i;
        }
    }

    if (!fix) {
        for (int i=0; i<n; ++i) {
            head[s[i]]=i+1;
        }
    } else {
        int val=s[sc];
        for (int i=sc; i<n; ++i) {
            head[s[i]]=val++;
            if (val>n) val-=n;
        }
    }
    hm=head[mmax];

    int idx=0;
    for (int i=n+1; i<mmax; ++i) {
        if (!head[i]) {
            ans[idx++]=hm;
            hm=i;
        } else {
            ans[idx++]=head[i];
        }
    }
    ans[idx]=hm;

    return mmax-n;
}

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

int countReplacement(int n, int s[]) {
    if (!valid(n,s)) return 0;

    ll ans=1;
    bool rot=false;

    int cnt=n,mmax=0;
    for (int i=0; i<n; ++i) {
        have[s[i]]=true;
        if (s[i]<=n) --cnt;
        mmax=max(mmax,s[i]);
    }

    if (cnt==n) rot=true;

    for (int i=n+1; i<=mmax; ++i) {
        if (have[i]) --cnt;
        else if (cnt) ans=(ans*cnt)%mod;
    }

    if (rot) {
        for (int i=1; i<=n; ++i) ans=(ans*i)%mod;
    }

    return ans%mod;
}
#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...