Submission #1308295

#TimeUsernameProblemLanguageResultExecution timeMemory
1308295RaresGondola (IOI14_gondola)C++20
75 / 100
45 ms5964 KiB
#include <bits/stdc++.h>
#include "gondola.h"
using namespace std;

const int MAXN=1e6+10;
const int MOD=1e9+9;

int f[MAXN];
map <int,bool> m;

int valid (int n, int a[]){
    int x=-1;
    for (int i=n;i>=1;--i){
        a[i]=a[i-1];
    }
    for (int i=1;i<=n;++i){
        if (m[a[i]]) return false;
        m[a[i]]=1;
        if (a[i]>n) continue;
        int crt=a[i]-i;
        if (crt<0) crt+=n;
        if (x==-1){
            x=crt;
        }
        else{
            if (x!=crt) return 0;
        }
    }
    return 1;
}
int val[MAXN];
int replacement(int n, int a[], int b[]){
    int crt=-1;
    for (int i=n;i>=1;--i){
        a[i]=a[i-1];
    }
    for (int i=1;i<=n;++i){
        if (a[i]<n){
            crt=a[i]-i;
            if (crt<0) crt+=n;
        }
    }
    if (crt==-1){
        int maxx=0,pcrt=1;
        for (int i=1;i<=n;++i){
            val[a[i]]=i;
            if (maxx<a[i]){
                maxx=a[i];
                pcrt=i;
            }
            a[i]=i;
        }

        for (int i=n+1;i<=maxx;++i){
            if (val[i]){
                b[i-n-1]=a[val[i]];
                a[val[i]]=i;
            }
            else{
                b[i-n-1]=a[pcrt];
                a[pcrt]=i;
            }
        }
        return maxx-n;
    }

    int maxx=0,pcrt=0;
    for (int i=1;i<=n;++i){
        if (a[i]>maxx){
            maxx=a[i];
            pcrt=i;
        }
        if (a[i]>n){
            int p=crt+i;
            if (p>n) p-=n;
            val[a[i]]=i;
            a[i]=p;
        }
    }

    for (int i=n+1;i<=maxx;++i){
        if (val[i]){
            b[i-n-1]=a[val[i]];
            a[val[i]]=i;
        }
        else{
            b[i-n-1]=a[pcrt];
            a[pcrt]=i;
        }
    }

    return maxx-n;

}

int expr (int x, int e){
    int p=1;
    while (e){
        if (e%2) p=1LL*p*x%MOD;
        x=1LL*x*x%MOD;
        e>>=1;
    }
    return p;
}

int countReplacement(int n, int a[]){
    if (!valid (n,a)) return 0;
    vector <int> v;
    for (int i=1;i<=n;++i){
        if (a[i]>n) v.push_back(a[i]);
    }
    int rez=1;

    sort (v.begin (),v.end ());
    int nra=v.size (),prev=n+1;
    for (auto x:v){
        int e=x-prev;

        rez=1LL*rez*expr (nra,e)%MOD;
        nra--;
        prev=x+1;
    }
    return rez;
}
#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...