Submission #582286

#TimeUsernameProblemLanguageResultExecution timeMemory
582286jasminGondola (IOI14_gondola)C++14
60 / 100
23 ms2960 KiB
#include<bits/stdc++.h>
#include<gondola.h>
using namespace std;

const int inf=1e9;
const int mod=1e9+9;

vector<int> reorder(int n, int s[]){
    int small=inf; int ind=-1;
    for(int i=0; i<n; i++){
        if(s[i]<small){
            small=s[i];
            ind=i;
        }
    }

    if(n<small){
        vector<int> ans(n);
        for(int i=0; i<n; i++){
            ans[i]=s[i];
        }
        return ans;
    }
    int start=(n+ind-(small-1))%n;
    vector<int> ans(n);
    for(int i=0; i<n; i++){
        ans[i]=s[(start+i)%n];
    }
    return ans;
}

int valid(int n, int inputSeq[]){
    vector<int> s=reorder(n, inputSeq);
    set<int> used;
    for(int i=0; i<n; i++){
        if(s[i]!=i+1){
            if(s[i]<=n || used.find(s[i])!=used.end()){
                return false;
            }
            used.insert(s[i]);
        }
    }
    return true;
}

int maximum(vector<int>& s){
    int ans=-1;
    for(auto e: s){
        ans=max(ans, e);
    }
    return ans;
}

int replacement(int n, int gondolaSeq[], int ans[]){
    vector<int> s=reorder(n, gondolaSeq);
    int size=maximum(s)-n;
    
    for(int i=0; i<size; i++){
        ans[i]=-1;
    }

    set<int> usable;
    for(int i=0; i<n; i++){
        if(s[i]>n){
            ans[s[i]-n-1]=i;
            usable.insert(i);
        }
    }
    iota(s.begin(), s.end(), 1);
    for(int i=0; i<size; i++){
        if(ans[i]==-1){
            int ind=*usable.begin();
            ans[i]=s[ind];
            s[ind]=n+i+1;
        }
        else{
            int ind=ans[i];
            usable.erase(ind);
            ans[i]=s[ind];
            s[ind]=n+i+1;
        }
    }

    return size;
}

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

    vector<int> s=reorder(n, inputSeq);
    int size=maximum(s)-n;
    vector<bool> def(size, false);

    int ans=1;
    int usable=0;
    for(int i=0; i<n; i++){
        if(s[i]>n){
            usable++;
            def[s[i]-n-1]=true;
        }
    }
    for(int i=0; i<size; i++){
        if(def[i]){
            usable--;
        }
        else{
            ans*=usable;
            ans%=mod;
        }
    }
    return ans;
}

/*signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n;
    cin >> n;
    int s[n];
    for(int i=0; i<n; i++){
        cin >> s[i];
    }
    cout << valid(n, s) << "\n";
    
    int rep[n*3];
    int size=replacement(n, s, rep);
    cout << size << "\n";
    for(auto e: rep){
        cout << e << " ";
    }
    cout << "\n";
    cout << countReplacement(n, s) << "\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...