# | Submission time | Handle | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
878467 | 2023-11-24T12:44:03 Z | JakobZorz | Gondola (IOI14_gondola) | C++17 | 0 ms | 0 KB |
#include"gondola.h" #include<iostream> #include<unordered_set> using namespace std; int valid(int n,int inputSeq[]){ unordered_set<int>s(inputSeq,inputSeq+n); if(s.size()!=n) return 0; int curr=-1; for(int i=0;i<2*n;i++){ if(curr==-1&&inputSeq[i%n]<=n) curr=inputSeq[i%n]; if(inputSeq[i%n]<=n&&curr!=inputSeq[i%n]) return 0; curr++; if(curr==n+1) curr=1; } return 1; } //---------------------- int replacement(int n,int gondolaSeq[],int replacementSeq[]){ int len=0; int mx=0; for(int i=0;i<n;i++) mx=max(mx,gondolaSeq[i]); len=mx-n; for(int i=0;i<len;i++) replacementSeq[i]=0; bool present=false; for(int i=0;i<n;i++) if(gondolaSeq[i]<=n) present=true; if(len==0) return 0; if(present){ int curr=-1; for(int i=0;i<2*n;i++){ if(curr==-1&&gondolaSeq[i%n]<=n) curr=gondolaSeq[i%n]; if(i>=n&&gondolaSeq[i%n]<mx&&gondolaSeq[i%n]>n){ replacementSeq[gondolaSeq[i%n]-n-1]=curr; } curr++; if(curr==n+1) curr=1; } curr=-1; for(int i=0;i<2*n;i++){ if(curr==-1&&gondolaSeq[i%n]<=n) curr=gondolaSeq[i%n]; if(i>=n&&gondolaSeq[i%n]==mx){ for(int i=0;i<len;i++){ if(replacementSeq[i]==0){ replacementSeq[i]=curr; curr=i+n+1; } } break; } curr++; if(curr==n+1) curr=1; } }else{ for(int i=0;i<n;i++){ if(gondolaSeq[i]<mx&&gondolaSeq[i]>n){ replacementSeq[gondolaSeq[i]-n-1]=i+1; } } for(int i=0;i<n;i++){ if(gondolaSeq[i]==mx){ int curr=i+1; for(int i=0;i<len;i++){ if(replacementSeq[i]==0){ replacementSeq[i]=curr; curr=i+n+1; } } } } } return len; } //---------------------- const int MOD=1e9+7; typedef long long ll; ll powm(ll base,ll exp){ ll res=1; for(int i=0;i<=30;i++){ if(exp&(1<<i)){ res=res*base%MOD; } base=base*base%MOD; } return res; } int countReplacement(int n,int inputSeq[]){ vector<int>arr; if(valid(n,inputSeq)==0) return 0; for(int i=0;i<n;i++) if(inputSeq[i]>n) arr.push_back(inputSeq[i]); sort(arr.begin(),arr.end()); ll res=1; int prev=n; for(int i=0;i<(int)arr.size();i++){ res=res*powm(arr.size()-i,arr[i]-prev-1)%MOD; prev=arr[i]; } return(int)res; }