Submission #775228

#TimeUsernameProblemLanguageResultExecution timeMemory
775228danikoynovGondola (IOI14_gondola)C++14
100 / 100
50 ms9388 KiB
#include "gondola.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 1e6 + 10;

ll cnt[maxn];
int valid(int n, int inputSeq[])
{
    for (ll i = 0; i < n; i ++)
    {
        ll val = inputSeq[(i + 1) % n];

        if (inputSeq[i] == n && val == 1)
            continue;
        if (val != inputSeq[i] + 1)
        {
            ///cout << i << endl;
            ///cout << inputSeq[i] << " " << val << endl;
            return 0;
        }

    }
    return 1;
}

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

ll order[maxn], to_go[maxn];
int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
    ll pivot = 0;
    while(pivot < n && gondolaSeq[pivot] > n)
        pivot ++;

    if (pivot == n)
    {
        pivot = 0;
        for (ll i = 0; i < n; i ++)
            order[i] = gondolaSeq[i];
    }
    else
    {
        order[gondolaSeq[pivot] - 1] = gondolaSeq[pivot];
        for (ll i = pivot + 1; i < n + pivot; i ++)
        {
            order[(gondolaSeq[pivot] - 1 + (i - pivot)) % n] = gondolaSeq[i % n];
        }
    }
    ///for (ll i = 0; i < n; i ++)
    ///cout << order[i] << " ";
    /// cout << endl;
    ll mx = 0, pt = 0;

    for (ll i = 0; i < n; i ++)
    {
        if (order[i] > n)
        {
            if (order[i] > mx)
            {
                mx = order[i];
                pt = i + 1;
            }
            to_go[order[i]] = i + 1;
        }
    }
    ///cout << mx << " " << pt << endl;

    ll idx = 0, last_free = pt;
    for (ll i = n + 1; i <= mx; i ++)
    {
        if (to_go[i] != 0)
        {
            if (to_go[i] == pt)
                replacementSeq[idx ++] = last_free;
            else
                replacementSeq[idx ++] = to_go[i];
        }
        else
        {
            replacementSeq[idx ++] = last_free;
            last_free = i;
        }
    }
    return max((ll)0, mx - n);
}

//----------------------
const ll mod = 1e9 + 9;
ll power(ll base, ll st)
{
    ll ans = 1;
    while(st > 0)
    {
        if (st %  2 == 1)
            ans = (ans * base) % mod;
        base = (base * base) % mod;
        st /= 2;
    }
    return ans;
}

int countReplacement(int n, int inputSeq[])
{

    map < ll, ll > mp;
    for (ll i = 0; i < n; i ++)
    {
        if (mp[inputSeq[i]] != 0)
            return 0;
        mp[inputSeq[i]] = 1;
    }

     ll pivot = 0;
    while(pivot < n && inputSeq[pivot] > n)
        pivot ++;

    if (pivot == n)
    {
        pivot = 0;
        for (ll i = 0; i < n; i ++)
            order[i] = inputSeq[i];
    }
    else
    {
        order[inputSeq[pivot] - 1] = inputSeq[pivot];
        for (ll i = pivot + 1; i < n + pivot; i ++)
        {
            order[(inputSeq[pivot] - 1 + (i - pivot)) % n] = inputSeq[i % n];
        }
    }
    /**for (ll i = 0; i < n; i ++)
    cout << order[i] << " ";
     cout << endl;*/
    ll mx = 0, pt = 0;
    vector < ll > db;
    for (ll i = 0; i < n; i ++)
    {
        if (order[i] > n)
        {
            if (order[i] > mx)
            {
                mx = order[i];
                pt = i + 1;
            }
            db.push_back(order[i]);
            //to_go[order[i]] = i + 1;
        }
    }
    ///cout << mx << " " << pt << endl;
    ll sp = 0;
    for (ll i = 0; i < n; i ++)
        if (order[i] > n)
        sp ++;

    //cout << sp << endl;
    ll idx = 0, last_free = pt;
    ll ways = 1;
    if (sp == n)
        ways = n;

        sort(db.begin(), db.end());
        ll last = n;
        for (ll cur : db)
        {
            ways = (ways * power(sp, cur - last - 1)) % mod;
            last = cur;
            sp --;
        }
    /**for (ll i = n + 1; i <= mx; i ++)
    {
        if (ways == 0)
            return 0;
        if (to_go[i] != 0)
        {
            sp --;
            //if (to_go[i] == pt)
              //  replacementSeq[idx ++] = last_free;
            //else
              ///  replacementSeq[idx ++] = to_go[i];
        }
        else
        {
            ///cout << i << " : " << sp << " " << ways << endl;
            ways = (ways * sp) % mod;
            ///replacementSeq[idx ++] = last_free;
            ///last_free = i;
        }
    }*/
    return ways;
}

Compilation message (stderr)

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:159:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
  159 |     if (sp == n)
      |     ^~
gondola.cpp:162:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
  162 |         sort(db.begin(), db.end());
      |         ^~~~
gondola.cpp:157:8: warning: unused variable 'idx' [-Wunused-variable]
  157 |     ll idx = 0, last_free = pt;
      |        ^~~
gondola.cpp:157:17: warning: unused variable 'last_free' [-Wunused-variable]
  157 |     ll idx = 0, last_free = pt;
      |                 ^~~~~~~~~
#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...