# | Submission time | Handle | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
30343 | 2017-07-23T09:11:18 Z | inqr | Gondola (IOI14_gondola) | C++14 | 0 ms | 0 KB |
#include "gondola.h" #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define rt insert #define st first #define nd second #define ll long long #define pii pair < int , int > #define DB printf("debug\n"); #define umax( x , y ) x = max( x , (y) ) #define umin( x , y ) x = min( x , (y) ) #define all(x) x.begin() , x.end() #define MOD 1000000009 using namespace std; int nx(int i,int sz){ return (i+1)%(sz); } map < int,int > timesseen; int origl=-1; int broken=0; long long ans=1; int valid(int n, int inputSeq[]) { vector < int > orig; for(int i=0;i<n;i++){ int nxx=nx(i,n); timesseen[inputSeq[i]]++; if(timesseen[inputSeq[i]]>1)return 0; if(inputSeq[i]<=n)orig.pb(inputSeq[i]); if(inputSeq[i]<=n&&inputSeq[nxx]<=n){ if(inputSeq[i]==n && inputSeq[nxx]!=1)return 0; else if(inputSeq[i]<n && inputSeq[nxx]!=inputSeq[i]+1)return 0; } } int startover=0; for(int i=0;i<orig.size();i++){ int nxx=nx(i,orig.size()); if(orig[i]<orig[nxx])continue; else if(startover==0)startover++; else if(startover==1)return 0; } return 1; } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]) { for(int i=0;i<n;i++){ int nxx=nx(i,n); if(gondolaSeq[i]<=n){ origl=i-(gondolaSeq[i]-1)+n; origl%=n; } umax(broken,gondolaSeq[i]-n); } if(origl==-1){ origl=0; ans*=n; ans%=MOD; } int repind[broken]; set < int > repcand; int orig[n]; for(int i=0;i<n;i++){ int ogon=(i+1)-origl+n; if(ogon>n)ogon%=n; orig[i]=ogon; if(gondolaSeq[i]>n){ repcand.insert(i); repind[gondolaSeq[i]-n-1]=i; } } for(int i=0;i<broken;i++){ if(!repind[i]){ ans*=repcand.size();ans%=MOD; replacementSeq[i]=orig[*repcand.begin()]; orig[*repcand.begin()]=i+n+1; } else{ replacementSeq[i]=orig[repind[i]]; orig[repind[i]]=i+n+1; repcand.erase(repcand.find(repind[i])); } } return broken; } int replacement2(int n, int gondolaSeq[]) { for(int i=0;i<n;i++){ int nxx=nx(i,n); if(gondolaSeq[i]<=n){ origl=i-(gondolaSeq[i]-1)+n; origl%=n; } umax(broken,gondolaSeq[i]-n); } if(origl==-1){ origl=0; ans*=n; ans%=MOD; } int repind[broken]; set < int > repcand; int orig[n]; for(int i=0;i<n;i++){ int ogon=(i+1)-origl+n; if(ogon>n)ogon%=n; orig[i]=ogon; if(gondolaSeq[i]>n){ repcand.insert(i); repind[gondolaSeq[i]-n-1]=i; } } for(int i=0;i<broken;i++){ if(!repind[i]){ ans*=repcand.size();ans%=MOD; orig[*repcand.begin()]=i+n+1; } else{ replacementSeq[i]=orig[repind[i]]; orig[repind[i]]=i+n+1; } } return broken; } //---------------------- int countReplacement(int n, int inputSeq[]) { if(valid(n,inputSeq)==0)return 0; int a=replacement2(n,gondolaSeq); if(a==0)return 1; return ans; }