Submission #1025420

#TimeUsernameProblemLanguageResultExecution timeMemory
1025420vjudge1Gondola (IOI14_gondola)C++17
100 / 100
56 ms6152 KiB
#include "gondola.h"
#include<bits/stdc++.h>
using namespace std;
int valid(int n, int inputSeq[]) {
    int PS=-1;
    set<int>st;
    for(int i=0;i<n;i++){
        st.insert(inputSeq[i]);
        if(inputSeq[i]>n)
            continue;
        int k=n+i-inputSeq[i];
        k%=n;
        if(PS==-1)
            PS=k;
        if(PS-k)
            return 0;
    }
    return 1&&st.size()==n;
}
map<int,int>IMPORTANT;
set<int>alive;
int replacement(int n, int gondolaSeq[], int replacementSeq[]){
    int k=*max_element(gondolaSeq,gondolaSeq+n)-n;
    int gondolaSeq2[250100],dn=0;
    for(int i=0;i<n;i++){
        if(gondolaSeq[i]<=n){
            if(!dn){
                dn=1;
                int j=i,k=gondolaSeq[i];
                do {
                    gondolaSeq2[j]=k;
                    j=(j+1)%n;
                    k=k%n+1;
                }while(j-i);
            }
        } else {
            IMPORTANT[gondolaSeq[i]]=i+1;
            alive.insert(i);
        }
    }
    if(!dn){
        iota(gondolaSeq2,gondolaSeq2+n,1);
    }
    for(int i=n;i++<n+k;){
        if(IMPORTANT[i]){
            int k=IMPORTANT[i]-1;
            replacementSeq[i-n-1]=gondolaSeq2[k];
            gondolaSeq2[k]=i;
            alive.erase(k);
        } else {
            IMPORTANT.erase(i);
            replacementSeq[i-n-1]=gondolaSeq2[*alive.begin()];
            gondolaSeq2[*alive.begin()]=i;
        }
    }
    return k;
}

//----------------------
#define int long long
typedef signed I;
const int mod=1e9+9;
int quickp(int a,int b){
    int ans=1;
    while(b){
        if(b&1)
            ans=ans*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return ans;
}
I countReplacement(I n, I inputSeq[]) {
    if(!valid(n,inputSeq))return 0;
    int ans=1;
    set<int>onesabove;
    for(int i=0;i<n;i++)
        if(inputSeq[i]>n)
            onesabove.insert(inputSeq[i]);
    if(size(onesabove)==n)
        ans=n;
    int prev=n,K=onesabove.size();
    for(auto i:onesabove){
        ans=ans*quickp(K,i-prev-1)%mod;
        K--;
        prev=i;
    }
    return ans;
}
#undef int

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:18:24: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   18 |     return 1&&st.size()==n;
      |               ~~~~~~~~~^~~
gondola.cpp: In function 'I countReplacement(I, I*)':
gondola.cpp:80:23: warning: comparison of integer expressions of different signedness: 'std::set<long long int>::size_type' {aka 'long unsigned int'} and 'I' {aka 'int'} [-Wsign-compare]
   80 |     if(size(onesabove)==n)
      |        ~~~~~~~~~~~~~~~^~~
#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...