# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
73288 | 2018-08-28T06:44:27 Z | Batmend4 | 곤돌라 (IOI14_gondola) | C++ | 0 ms | 0 KB |
#include "gondola.h" #include <iostream> #include<cstdio> #include<vector> #include<map> using namespace std; long long power( int x, int e ){ long long _pos = x; long long _s = 1; while( e ){ int a = e % 2; if( a == 1 ){ _s *= _pos; _s %= 1000000009; } _pos *= x; _pos %= 1000000009; e /= 2; } return _s; } int valid(int n, int inputSeq[]) { map< int, bool> m; bool lol = 1; int ind = -1; for( int i = 0 ; i < n ; i++ ){ if( inputSeq[i] <= n ){ lol = 0; ind = i; } if( inputSeq[i] > n ){ if( m[inputSeq[i]] == 1 ) return 0; m[inputSeq[i]] = 1; } } if( lol == 1 ){ return 1; } int ct[n + 5]; int nn = n + inputSeq[ind] - 1 - ind; for( int i = 0 ; i < n ; i++ ){ ct[(nn + i) % n] = inputSeq[i]; } for( int i = 0 ; i < n ; i++ ){ if( ct[i] <= n ){ if( i != ct[i] - 1 ){ return 0; } } } return 1; } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]) { int ind = -1; int ct[n + 5]; vector< pair<int, int> >v; for( int i = 0 ; i < n ; i++ ){ if( gondolaSeq[i] <= n ){ ind = i; } } int nn = n + gondolaSeq[ind] - 1 - ind; for( int i = 0 ; i < n ; i++ ){ ct[(nn + i) % n] = gondolaSeq[i]; } for( int i = 0 ; i < n ; i++ ){ v.push_back( make_pair(ct[i], i)); } sort( v.begin(), v.end()); int pos = 0; for( int i = 0 ; i < n ; i++ ){ int ct1 = v[i].first; if( ct1 <= n ) continue; if( i == 0 ){ replacementSeq[pos] = v[0].second + 1; pos++; for( int ii = n + 1 ; ii < v[0].first ; ii++ ){ replacementSeq[pos] = ii; pos++; } continue; } if( v[i - 1].first <= n ){ replacementSeq[pos] = v[i].second + 1; pos++; for( int ii = n + 1 ; ii < v[i].first ; ii++ ){ replacementSeq[pos] = ii; pos++; } continue; } replacementSeq[pos] = v[i].second + 1; pos++; for( int ii = v[i-1].first + 1 ; ii < v[i].first ; ii++ ){ replacementSeq[pos] = ii; pos++; } } return pos; } //---------------------- int countReplacement(int n, int inputSeq[]) { if( valid( n, inputSeq) != 1 ){ return 0; } vector<int> v; bool lol = 1; bool fuck = 1; for( int i = 0 ; i < n ; i++ ){ if( inputSeq[i] > n ) lol = 0; if( inputSeq[i] <= n ) fuck = 0; v.push_back(inputSeq[i]); } if( lol == 1 ) return 1; sort( v.begin(), v.end()); long long s = 1; int pos = n + 1; for( int i = 0 ; i < n ; i++){ if( v[i] <= n ) continue; s *= power( n - i, v[i] - pos ); s %= 1000000009; pos = v[i] + 1; } if( fuck == 1 ){ s *= n; n %= 1000000009; } return s; }