Submission #918326

#TimeUsernameProblemLanguageResultExecution timeMemory
918326contest_altGondola (IOI14_gondola)C++17
100 / 100
20 ms3560 KiB
#include "gondola.h" #include <algorithm> #include <vector> #include <stdio.h> int valid( int n, int inputSeq[] ) { int shift_min = n, shift_max = -1; std::vector<int> vals( n ); for( int i = 0 ; i < n ; i++ ){ vals[i] = inputSeq[i]; if( inputSeq[i] > n ) continue; if( inputSeq[i] <= 0 ) return false; int shift = (inputSeq[i] - 1 + n - i) % n; shift_min = std::min( shift_min, shift ); shift_max = std::max( shift_max, shift ); } for( int i = 1 ; i < n ; i++ ) if( vals[i - 1] == vals[i] ) return false; if( shift_max < 0 ) return true; return shift_min == shift_max; } //---------------------- int replacement( int n, int gondolaSeq[], int replacementSeq[] ) { std::vector<int> base( n ); bool has_base = false; std::vector<std::pair<int, int>> repl; for( int i = 0 ; i < n ; i++ ){ int x = gondolaSeq[i]; if( !has_base && x <= n ){ has_base = true; for( int j = 0 ; j < n ; j++ ) base[(i + j) % n] = (x - 1 + j) % n + 1; } if( x > n ) repl.emplace_back( x, i ); } if( !has_base ) for( int i = 0 ; i < n ; i++ ) base[i] = i + 1; std::sort( repl.begin(), repl.end() ); int len = 0, last = n; for( auto p : repl ){ // o nu... nu am c++17 in 2014 int idx = p.second; int val = p.first; while( base[idx] != val ){ replacementSeq[len++] = base[idx]; base[idx] = ++last; } } return len; } //---------------------- const int MOD = 1e9 + 9; using ll = long long; struct ZP { int x; ZP( ll x = 0 ): x( x % MOD ) {} explicit operator int() { return x; } ZP operator *= ( const ZP& that ) { return *this = ZP( x * (ll)that.x ); } ZP operator += ( const ZP& that ) { x += that.x; if( x >= MOD ) x -= MOD; return *this; } ZP operator * ( const ZP& that ) const { return ZP( *this ) *= that; } ZP operator + ( const ZP& that ) const { return ZP( *this ) += that; } }; ZP lgput( ZP base, int exp ) { ZP ret = 1; while( exp ){ if( exp & 1 ) ret *= base; base *= base; exp >>= 1; } return ret; } int countReplacement( int n, int inputSeq[] ) { if( !valid( n, inputSeq ) ) return 0; std::vector<int> base( n ); bool has_base = false; std::vector<std::pair<int, int>> repl; for( int i = 0 ; i < n ; i++ ){ int x = inputSeq[i]; if( !has_base && x <= n ){ has_base = true; for( int j = 0 ; j < n ; j++ ) base[(i + j) % n] = (x - 1 + j) % n + 1; } if( x > n ) repl.emplace_back( x, i ); } std::sort( repl.begin(), repl.end() ); ZP ret = 1; int variante = (int)repl.size(); int prev = n; for( auto p : repl ){ int val = p.first; int idx = p.second; //printf( "askhdbsahkdas, variante = %d\n", variante ); ret *= lgput( ZP( variante ), val - prev - 1 ); variante--; prev = val; } // mai avem inca n variante la alegerea primului element din vectorul final (shiftul) if( !has_base ) ret *= ZP( n ); return int(ret); }

Compilation message (stderr)

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:149:9: warning: unused variable 'idx' [-Wunused-variable]
  149 |     int idx = p.second;
      |         ^~~
#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...