Submission #411984

#TimeUsernameProblemLanguageResultExecution timeMemory
411984losmi247Gondola (IOI14_gondola)C++14
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
#include "gondola.h"
using namespace std;
typedef long long ll;
const int N = 1e5+34;
const int mod = 1000000009;

int n,a[N];
map <int,int> pos,bio;
int treba[N];

int valid(int br,int *inputseq){
    n = br;
    for(int i = 1; i <= n; i++) a[i] = inputseq[i-1];

    for(int i = 1; i <= n; i++){
        if(a[i] <= n) pos[a[i]] = i;
        if(bio[a[i]]) return 0;
        bio[a[i]] = 1;
    }
    int lst = 0;
    bool ok = 1;
    for(int i = 1; i <= n; i++){
        if(!pos[i]) continue;
        if(!lst){
            lst = i;
            continue;
        }
        if(pos[lst] < pos[i]){
            if(pos[i]-pos[lst] != i-lst){
                ok = 0;
                break;
            }
        }
        else{
            if(pos[lst]-pos[i]-1 != lst-1+n-i){
                ok = 0;
                break;
            }
        }
        lst = i;
    }

    return ok;
}

int replacement(int br,int *gondolaSeq,int *replacementSeq){
    n = br;
    for(int i = 1; i <= n; i++) a[i] = gondolaSeq[i-1];



    for(int i = 1; i <= n; i++){
        if(a[i] <= n){
            treba[i] = a[i];
        }
        else if(i > 1){
            if(treba[i-1] == n) treba[i] = 1;
            else if(treba[i-1]) treba[i] = treba[i-1]+1;
        }
    }

    for(int i = n; i >= 1; i--){
        if(treba[i]) continue;
        if(treba[i+1] == 1) treba[i] = n;
        else treba[i] = treba[i+1]-1;
    }

    bool svi = 1;
    for(int i = 1; i <= n; i++){
        if(a[i] <= n) svi = 0;
    }
    if(svi){
        for(int i = 1; i <= n; i++){
            treba[i] = i;
        }
    }

    for(int i = 1; i <= n; i++){
        assert(1 <= treba[i] && treba[i] <= n);
    }

    vector <pair<int,int>> v;
    for(int i = 1; i <= n; i++){
        if(treba[i] != a[i]) v.push_back({a[i],treba[i]});
    }

    sort(v.begin(),v.end());

    /*cout << v.size() << " evo" << endl;
    for(auto f : v){
        cout << f.first << " " << f.second << endl;
    }
    cout << endl;*/

    int cnt = 0,stigo = n;
    for(auto f : v){
        for(int j = stigo; j < f.first; j++) replacementSeq[cnt++] = (j == stigo ? f.second : j);
        stigo = f.first;
    }

    return cnt;
}

ll fp(ll x,ll y){
    if(y == 0){
        return 1;
    }
    ll p = fp(x,y/2);
    p = (p*p)%mod;
    if(y&1){
        p = (p*x)%mod;
    }
    return p;
}

ll countReplacement(int br,int *inputSeq){
    n = br;
    for(int i = 1; i <= n; i++) a[i] = inputSeq[i-1];

    if(!valid(br,inputSeq)){
        return 0;
    }

    for(int i = 1; i <= n; i++){
        if(a[i] <= n){
            treba[i] = a[i];
        }
        else if(i > 1){
            if(treba[i-1] == n) treba[i] = 1;
            else if(treba[i-1]) treba[i] = treba[i-1]+1;
        }
    }

    for(int i = n; i >= 1; i--){
        if(treba[i]) continue;
        if(treba[i+1] == 1) treba[i] = n;
        else treba[i] = treba[i+1]-1;
    }

    bool svi = 1;
    for(int i = 1; i <= n; i++){
        if(a[i] <= n) svi = 0;
    }
    if(svi){
        for(int i = 1; i <= n; i++){
            treba[i] = i;
        }
    }

    for(int i = 1; i <= n; i++){
        assert(1 <= treba[i] && treba[i] <= n);
    }

    vector <pair<ll,ll>> v;
    for(int i = 1; i <= n; i++){
        if(treba[i] != a[i]) v.push_back({a[i],treba[i]});
    }

    sort(v.begin(),v.end());

    ll k = v.size();
    ll sol = 1;
    ll prosli = n;
    for(ll i = 0; i < v.size(); i++){
        if(i == 0){
            ll pom = fp(k,v[i].first-prosli-1);
            sol *= pom;
            sol %= mod;
            prosli = v[i].first;
        }
        else{
            ll pom = fp(k-i,v[i].first-prosli-1);
            sol *= pom;
            sol %= mod;
            prosli = v[i].first;
        }
    }

    if(svi){
        ll fak = 1;
        for(ll i = 2; i <= n; i++){
            fak *= i;
            fak %= mod;
        }
        sol *= fak;
        sol %= mod;
    }

    return sol;
}

/*int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int a;
    cin >> a;
    int *niz = (int*)malloc(sizeof(int)*a);
    for(int i = 0; i < a; i++) cin >> niz[i];
    cout << valid(a,niz) << endl;

    int a;
    cin >> a;
    int *niz = (int*)malloc(sizeof(int)*a);
    for(int i = 0; i < a; i++) cin >> niz[i];
    int *drugi = (int*)malloc(sizeof(int)*200);
    int len = replacement(a,niz,drugi);
    cout << len << endl;
    for(int i = 0; i < len; i++){
        cout << drugi[i] << " ";
    }
    cout << endl;

    int a;
    cin >> a;
    int *niz = (int*)malloc(sizeof(int)*a);
    for(int i = 0; i < a; i++) cin >> niz[i];
    cout << countReplacement(a,niz) << endl;
}*/

Compilation message (stderr)

gondola.cpp:117:4: error: ambiguating new declaration of 'll countReplacement(int, int*)'
  117 | ll countReplacement(int br,int *inputSeq){
      |    ^~~~~~~~~~~~~~~~
In file included from gondola.cpp:2:
gondola.h:12:5: note: old declaration 'int countReplacement(int, int*)'
   12 | int countReplacement(int n, int inputSeq[]);
      |     ^~~~~~~~~~~~~~~~
gondola.cpp: In function 'll countReplacement(int, int*)':
gondola.cpp:165:21: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  165 |     for(ll i = 0; i < v.size(); i++){
      |                   ~~^~~~~~~~~~