Submission #444224

#TimeUsernameProblemLanguageResultExecution timeMemory
444224FEDIKUSGondola (IOI14_gondola)C++17
75 / 100
64 ms7116 KiB
#include "gondola.h"

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int maxn=2.5e5+10;
set<int> imam;

int valid(int n, int inputSeq[]){
    int tren=-1;
    for(int i=0;i<n;i++){
        if(imam.find(inputSeq[i])!=imam.end()) return 0;
        imam.emplace(inputSeq[i]);
        if(inputSeq[i]>n){
            if(tren!=-1) tren++;
            if(tren>n) tren=1;
            continue;
        }
        if(tren==-1) tren=inputSeq[i];
        else{
            if(inputSeq[i]!=tren) return 0;
        }
        tren++;
        if(tren>n) tren=1;
    }
    return 1;
}

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

int treba[maxn];

int replacement(int n, int gondolaSeq[], int replacementSeq[]){
    int l=0;
    int tren=-1;
    int maxi=INT_MIN;
    int mini=INT_MAX;
    for(int i=0;i<n;i++) maxi=max(maxi,gondolaSeq[i]);
    for(int i=0;i<n;i++) mini=min(mini,gondolaSeq[i]);
    int gde=-1;
    if(mini>n) tren=1;
    for(int j=0;j<2*n;j++){
        int i=j%n;
        if(gondolaSeq[i]>n){
            if(tren!=-1){
                if(gondolaSeq[i]==maxi) gde=tren;
                treba[gondolaSeq[i]]=tren;
                tren++;
                if(tren>n) tren=1;
            }
            continue;
        }
        if(tren==-1) tren=gondolaSeq[i];
        tren++;
        if(tren>n) tren=1;
    }
    for(int i=n+1;i<=maxi;i++){
        if(treba[i]!=0){
            if(i==maxi) replacementSeq[l++]=gde;
            else replacementSeq[l++]=treba[i];
        }else{
            replacementSeq[l++]=gde;
            gde=i;
        }
    }
    return l;
}

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

const int mod=1e9+9;

int mul(int a,int b){
    if(ll(a)*ll(b)>=mod) return ll(a)*ll(b)%mod;
    return a*b;
}

int pwr(int a,int b){
    int ret=1;
    while(b){
        if(b&1) ret=mul(ret,a);
        b>>=1;
        a=mul(a,a);
    }
    return ret;
}

int countReplacement(int n, int inputSeq[]){
    int res=1;
    if(!valid(n,inputSeq)) return 0;
    int mini=INT_MAX;
    for(int i=0;i<n;i++) mini=min(mini,inputSeq[i]);
    int klk=0;
    set<int> koji;
    for(int i=0;i<n;i++){
        if(inputSeq[i]>n){
            klk++;
            koji.emplace(inputSeq[i]);
        }
    }
    int prosli=n;
    for(auto i:koji){
        res=mul(res,pwr(klk,i-prosli-1));
        klk--;
        prosli=i;
    }
    return res;
}
/*
9
4
1 2 7 6
*/
#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...