Submission #1350819

#TimeUsernameProblemLanguageResultExecution timeMemory
1350819ElayV13Gondola (IOI14_gondola)C++20
75 / 100
22 ms5412 KiB
#include "gondola.h"
#include "bits/stdc++.h"
using namespace std;

#define ll long long
const ll mod=1e9+9;

int valid(int n,int inputSeq[])
{
      vector<int>all;
      for(int i=0;i<n;i++) all.push_back(inputSeq[i]);
      for(int i=0;i<n;i++) all.push_back(inputSeq[i]);
      int mn=*min_element(all.begin(),all.end());
      int one=-1;
      for(int i=0;i<all.size();i++){
            if(all[i]==mn){
                  one=i;
                  break;
            }
      }
      int cur=one,val=1;
      for(int i=1;i<=n;i++){
            if(all[cur]!=val) return 0;
            ++cur;
            ++val;
      }
      return 1;
}

int replacement(int n,int gondolaSeq[],int replacementSeq[])
{
      vector<int>all;
      for(int i=0;i<n;i++) all.push_back(gondolaSeq[i]);
      int mn=*min_element(all.begin(),all.end());
      vector<int>vec;
      if(mn>n){
            for(int i=1;i<=n;i++) vec.push_back(i);
      }
      else{
            vec.assign(n,-1);
            for(int i=0;i<n;i++){
                  if(gondolaSeq[i]<=n){
                        int cur=gondolaSeq[i];
                        vec[i]=cur;
                        for(int j=i+1;j<n;j++){
                              cur++;
                              if(cur==n+1) cur=1;
                              vec[j]=cur;
                        }
                        cur=gondolaSeq[i];
                        for(int j=i-1;j>=0;j--){
                              cur--;
                              if(cur==0) cur=n;
                              vec[j]=cur;
                        }
                        break;
                  }
            }
      }
      vector<pair<int,int>>srt;
      for(int i=0;i<n;i++){
            if(vec[i]!=gondolaSeq[i]) srt.push_back({gondolaSeq[i],i});
      }
      sort(srt.begin(),srt.end());
      int cur=n+1;
      int po=0;
      for(int i=0;i<srt.size();i++){
            int id=srt[i].second;
            int val=srt[i].first;
            for(int j=cur;j<=val;j++){
                  replacementSeq[po++]=vec[id];
                  vec[id]=cur++;
            }
      }
      return po;
}

int countReplacement(int n,int inputSeq[])
{
      vector<int>all;
      set<int>st;
      for(int i=0;i<n;i++) all.push_back(inputSeq[i]),st.insert(inputSeq[i]);
      if(st.size()!=n) return 0;
      int mn=*min_element(all.begin(),all.end());
      vector<int>vec;
      if(mn>n){
            for(int i=1;i<=n;i++) vec.push_back(i);
      }
      else{
            vec.assign(n,-1);
            for(int i=0;i<n;i++){
                  if(inputSeq[i]<=n){
                        int cur=inputSeq[i];
                        vec[i]=cur;
                        for(int j=i+1;j<n;j++){
                              cur++;
                              if(cur==n+1) cur=1;
                              vec[j]=cur;
                        }
                        cur=inputSeq[i];
                        for(int j=i-1;j>=0;j--){
                              cur--;
                              if(cur==0) cur=n;
                              vec[j]=cur;
                        }
                        break;
                  }
            }
      }
      vector<pair<int,int>>srt;
      for(int i=0;i<n;i++){
            if(vec[i]!=inputSeq[i]) srt.push_back({inputSeq[i],i});
      }
      sort(srt.begin(),srt.end());
      ll rem=srt.size();
      int cur=n+1;
      ll res=1;
      for(int i=0;i<srt.size();i++){
            int id=srt[i].second;
            int val=srt[i].first;
            for(int j=cur;j<=val;j++){
                  if(j!=val) res=(res*rem)%mod;
                  vec[id]=cur++;
            }
            --rem;
      }
      return res;
}
#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...