Submission #1032896

#TimeUsernameProblemLanguageResultExecution timeMemory
1032896vjudge1Gondola (IOI14_gondola)C++17
75 / 100
29 ms5736 KiB
#include "gondola.h"

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

int valid(int n, int inputSeq[])
{
    int ind[n+1];
    for(int i=0;i<=n;i++)ind[i]=-1;
    unordered_set<int>seen;
    for(int i=0;i<n;i++){
        if(seen.count(inputSeq[i]))return 0;
        seen.insert(inputSeq[i]);
        if(inputSeq[i]<=n){
            ind[inputSeq[i]]=i;
        }
    }
    int val=-1,beg;
    for(int i=1;i<=n;i++){
        if(ind[i]!=-1){
            val=i;
            beg=ind[i];
            break;
        }
    }
    if(val==-1)return 1;
    for(int j=(beg+1)%n;j!=beg;j=(j+1)%n){
        val++;
        if(inputSeq[j]==val)continue;
        if(inputSeq[j]<=n)return 0;
    }
    return 1;
}

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

int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
    int*a=gondolaSeq,*b=replacementSeq;
    int ind[n+1];
    for(int i=0;i<=n;i++)ind[i]=-1;
    for(int i=0;i<n;i++){
        if(a[i]<=n){
            ind[a[i]]=i;
        }
    }
    int val=1,beg=0;
    for(int i=1;i<=n;i++){
        if(ind[i]!=-1){
            val=i;
            beg=ind[i];
            break;
        }
    }
    int begval[n];
    begval[beg]=val;
    for(int j=(beg+1)%n;j!=beg;j=(j+1)%n){
        val++;
        if(n<val)val-=n;
        begval[j]=val;
    }
    int place=0;
    int cur=n+1;
    int p[n];
    for(int i=0;i<n;i++){
        p[i]=i;
    }
    sort(p,p+n,[&](int i,int j)->bool {
        return a[i]<a[j];
    });
    for(int i=0;i<n;i++){
        int pp=p[i];
        while(begval[pp]<a[pp]){
            b[place++]=begval[pp];
            begval[pp]=cur++;
        }
    }
    return place;
}

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

const int mod=1e9+9;

using lint=int64_t;

int mul(lint i,lint j){
    return i*j%mod;
}

int countReplacement(int n, int inputSeq[])
{
    int*a=inputSeq;
    if(!valid(n,a))return 0;
    int ind[n+1];
    for(int i=0;i<=n;i++)ind[i]=-1;
    for(int i=0;i<n;i++){
        if(a[i]<=n){
            ind[a[i]]=i;
        }
    }
    int val=1,beg=0;
    for(int i=1;i<=n;i++){
        if(ind[i]!=-1){
            val=i;
            beg=ind[i];
            break;
        }
    }
    int begval[n];
    begval[beg]=val;
    for(int j=(beg+1)%n;j!=beg;j=(j+1)%n){
        val++;
        if(n<val)val-=n;
        begval[j]=val;
    }
    int place=0;
    int cur=n+1;
    int p[n];
    for(int i=0;i<n;i++){
        p[i]=i;
    }
    sort(p,p+n,[&](int i,int j)->bool {
        return a[i]<a[j];
    });
    int ans=1;
    int haveblock=n;
    for(int i=0;i<n;i++){
        int pp=p[i];
        while(begval[pp]<a[pp]){
            begval[pp]=cur++;
            if(begval[pp]<a[pp]){
                ans=mul(ans,haveblock);
            }
        }
        haveblock--;
    }
    return ans;
}

Compilation message (stderr)

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:117:9: warning: unused variable 'place' [-Wunused-variable]
  117 |     int place=0;
      |         ^~~~~
#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...