Submission #516080

#TimeUsernameProblemLanguageResultExecution timeMemory
516080antonioqbabGondola (IOI14_gondola)C++14
60 / 100
42 ms5120 KiB
#include <bits/stdc++.h>
#include <gondola.h>

using namespace std;


int valid(int n, int a[])
{
    map<int,int> mp;
    int index=-1;
    for(int i=0; i<n; ++i)
    {
        if(mp.count(a[i]))
            return 0;
        ++mp[a[i]];
    }
    for(int i=0; i<n; ++i)
        if(a[i]<=n)
        {
            index=i;
            break;
        }
    if(index==-1)
        return 1;
    int cur=a[index];
    cur=cur==n?1:cur+1;
    for(int j=(index+1)%n; j!=index; j=(j+1)%n,cur=cur==n?1:cur+1)
        if(a[j]<=n && a[j] !=cur)
            return 0;
    return 1;
}

int replacement(int n, int a[], int ans[])
{
    vector<int> real(n);
    int index=-1, sol=0, cur;
    for(int i=0; i<n; ++i)
        if(a[i]<=n)
        {
            real[i]=a[i];
            index=i;
            break;
        }
    if(index==-1){
        real[0]=1;
        index=0;
    }
    cur=real[index];
    cur=cur==n?1:cur+1;
    for(int j=(index+1)%n; j!=index; j=(j+1)%n,cur=cur==n?1:cur+1)
        real[j]=cur;
    vector<pair<int,int>> b;
    for(int i=0; i<n; ++i)
        if(a[i]>n)
            b.emplace_back(a[i],i);
    sort(b.begin(),b.end());
    int last=n;
    for(auto [val,idx]:b)
    {
        ans[sol++]=real[idx];
        for(int i=last+1; i<val; ++i)
            ans[sol++]=i;
        last=val;
    }
    return sol;
}

int countReplacement(int n, int a[])
{
    if(!valid(n,a))
        return 0;
    const int mod = 1e9+9;
     vector<int> real(n);
    int index=-1, cur, sol=1;
    for(int i=0; i<n; ++i)
        if(a[i]<=n)
        {
            real[i]=a[i];
            index=i;
            break;
        }
    if(index==-1){
        real[0]=1;
        sol = n;
        index=0;
    }
    cur=real[index];
    cur=cur==n?1:cur+1;
    for(int j=(index+1)%n; j!=index; j=(j+1)%n,cur=cur==n?1:cur+1)
        real[j]=cur;
    vector<pair<int,int>> b;
    for(int i=0; i<n; ++i)
        if(a[i]>n)
            b.emplace_back(a[i],i);
    sort(b.begin(),b.end());
    int last=n, cnt=b.size();
    auto pow=[&](int b, int e){
        if(e<1)
            return 1;
        int ans =1;
        while(e){
            if(e&1)
                ans=1LL*ans*b%mod;
            b=1LL*b*b%mod, e>>=1;
        }
        return ans;
    };
    for(auto [val,idx]:b)
    {

        sol=(1LL*sol*pow(cnt,val-1-last))%mod;
        last=val;
    }
    return sol;
}

Compilation message (stderr)

gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:58:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   58 |     for(auto [val,idx]:b)
      |              ^
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:108:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  108 |     for(auto [val,idx]:b)
      |              ^
#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...