Submission #291371

#TimeUsernameProblemLanguageResultExecution timeMemory
291371georgerapeanuGondola (IOI14_gondola)C++11
75 / 100
25 ms2944 KiB
#include "gondola.h"
#include <cstdio>
#include <algorithm>

using namespace std;

inline int get_in_range(int st,int dr,int val){
    int tmp = (val - st) % (dr - st + 1);

    if(tmp < 0){
        tmp += (dr - st + 1);
    }

    return tmp + st;
}

int stuff[250005];

int valid(int n, int inputSeq[])
{
    int pos = -1;
    for(int i = 0;i < n;i++){
        if(inputSeq[i] <= n){
            pos = i;
        }
        stuff[inputSeq[i]]++;
        if(stuff[inputSeq[i]] > 1){
            return 0;
        }
    }

    for(int i = 0;i < n;i++){
        if(inputSeq[i] <= n && inputSeq[i] != get_in_range(1,n,inputSeq[pos] + i - pos)){
            return 0;
        }
    }

    return 1;
}

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

int replacement(int n, int gondolaSeq[], int replacementSeq[])
{

    for(int i = 0;i <= 2e5;i++){
        stuff[i] = -1;
    }

    int ma = 0,ma_pos;
    int pos = -1;

    for(int i = 0;i < n;i++){
        stuff[gondolaSeq[i]] = i;
        ma = max(ma,gondolaSeq[i]);
        if(ma == gondolaSeq[i]){
            ma_pos = i;
        }
        if(gondolaSeq[i] <= n){
            pos = i;
        }
    }

    if(pos == -1){
        pos = 0;
        gondolaSeq[pos] = 1;
    }

    for(int i = 0;i < n;i++){
        gondolaSeq[i] = get_in_range(1,n,gondolaSeq[pos] + i - pos);
    }

    int len = 0;

    for(int i = n + 1;i <= ma;i++){
        if(stuff[i] == -1){
            replacementSeq[len++] = gondolaSeq[ma_pos];
            gondolaSeq[ma_pos] = i;
        }
        else{
            replacementSeq[len++] = gondolaSeq[stuff[i]];
            gondolaSeq[stuff[i]] = i;
        }
    }

    return len;
}

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

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

    int ans = n;

    for(int i = 0;i < n;i++){
        stuff[inputSeq[i]] = 1;
        if(inputSeq[i] <= n){
            ans = 1;
        }
    }

    const int MOD = 1e9 + 9;

    for(int i = 2e5;i >= n + 1;i--){
        if(stuff[i] == 0 && stuff[i + 1] > 0){
            ans = 1LL * ans * stuff[i + 1] % MOD;
        }
        stuff[i] += stuff[i + 1];
    }

    return ans;
}

Compilation message (stderr)

gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:77:48: warning: 'ma_pos' may be used uninitialized in this function [-Wmaybe-uninitialized]
   77 |             replacementSeq[len++] = gondolaSeq[ma_pos];
      |                                                ^~~~~~
#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...