제출 #238251

#제출 시각아이디문제언어결과실행 시간메모리
238251nicolaalexandra곤돌라 (IOI14_gondola)C++14
100 / 100
75 ms5496 KiB
#include <bits/stdc++.h>
#include "gondola.h"
#define DIM 100010
#define MOD 1000000009
using namespace std;

map <int,int> f;
pair <int,int> w[DIM];
int sol[DIM],a[DIM];

int get_next (int val, int n){
    if (val == n)
        return 1;
    return val+1;
}
int get_ant (int val, int n){
    if (val == 1)
        return n;
    return val-1;
}

inline int cmp (pair<int,int> a, pair<int,int> b){
    return a.second < b.second;
}

int lg_put (int a, int b){
    if (!b)
        return 1;
    int nr = lg_put (a,b/2);
    if (b%2)
        return 1LL*(1LL * nr * nr % MOD) * a % MOD;
    else return (1LL * nr * nr % MOD);
}

int valid (int n, int v[]){
    int i, poz = -1;

    for (i=0;i<n;i++){
        f[v[i]]++;
        if (f[v[i]] >= 2)
            return 0;
    }

    for (i=0;i<n;i++)
        if (v[i] <= n){
            poz = i;
            break;
        }

    if (poz == -1)
        return 1;

    int val = v[poz];
    for (i=poz+1;i<n;i++){
        val = get_next (val,n);
        if (v[i] <= n && v[i] != val)
            return 0;
    }

    val = v[poz];
    for (i=poz-1;i>=0;i--){
        val = get_ant (val,n);
        if (v[i] <= n && v[i] != val)
            return 0;
    }

    return 1;

}



int replacement (int n, int v[], int replacementSeq[]){
    int i, poz = -1, k = 0;
    for (i=0;i<n;i++)
        if (v[i] <= n){
            poz = i;
            break;
        }

    /// if (poz == -1) ???

    int val = v[poz];
    for (i=poz+1;i<n;i++){
        val = get_next (val,n);
        if (v[i] > n)
            w[++k] = make_pair(val,v[i]);
    }

    val = v[poz];
    for (i=poz-1;i>=0;i--){
        val = get_ant (val,n);
        if (v[i] > n)
            w[++k] = make_pair(val,v[i]);
    }

    sort (w+1,w+k+1,cmp);
    int last = n+1, el = 0;

    for (i=1;i<=k;i++){

        replacementSeq[el++] = w[i].first;

        while (last <= w[i].second){
            if (last < w[i].second)
                replacementSeq[el++] = last;
            last++;
        }

    }
    return el;
}
int countReplacement(int n, int v[]){
    if (!valid(n,v))
        return 0;

    int i, k = 0;
    for (i=0;i<n;i++){
        if (v[i] > n)
            a[++k] = v[i];
    }

    sort (a+1,a+k+1);
    a[0] = n;

    long long sol = 1;
    for (i=1;i<=k;i++)
        sol = sol * lg_put (k-i+1,a[i]-a[i-1]-1) % MOD;

    if (k == n)
        sol = sol * n % MOD;

    return sol;
}
#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...