# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
131417 | DodgeBallMan | 곤돌라 (IOI14_gondola) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>/
#include "gondola.h"
#define pii pair<int, int>
#define x first
#define y second
using namespace std;
long long mod = 1e9 + 9;
int valid( int n, int num[] ) {
unordered_map<int,int> m;
int st = 0;
for( int i = 0 ; i < n ; i++ ) {
if( m[num[i]] > 0 ) return 0;
if( num[i] <= n && st == 0 ) st = num[i];
else if( num[i] <= n && st > 0 && st != num[i] ) return 0;
if( st != 0 ) st = ( st % n ) + 1;
m[num[i]]++;
}
return 1;
}
int replacement( int n, int num[], int se[] ) {
vector<pii> all;
int ori[250100];
memset( ori, -1, sizeof ori );
for( int i = 0 ; i < n ; i++ ) if( num[i] <= n ) {
ori[i] = num[i] - 1;
for( int j = i + 1 ; j < n ; j++ ) ori[j] = ( num[i] - 1 + j - i ) % n;
for( int j = i - 1 ; j >= 0 ; j-- ) ori[j] = ( num[i] - 1 + n + j - i ) % n;
break;
}
if( ori[0] == -1 ) for( int i = 0 ; i < n ; i++ ) ori[i] = i;
for( int i = 0 ; i < n ; i++ ) ori[i]++;
for( int i = 0 ; i < n ; i++ ) if( num[i] > n ) all.emplace_back( pii( num[i], ori[i] ) );
sort( all.begin(), all.end() );
int cnt = 0, fix = n + 1;
for( int i = 0 ; i < all.size() ; i++ ) {
int a, b;
tie( a, b ) = all[i];
while( b != a ) {
se[cnt] = b;
b = fix;
cnt++, fix++;
}
}
return cnt;
}
long long modpow( long long base, long long power ) {
long long ret = 1;
for( ; power ; power >>= 1) {
if( power & 1 ) ret = ( ret * base ) % mod;
base = ( base * base ) % mod;
}
return ret;
}
int countReplacement( int n, int num[] ) {
vector<int> all;
if( !valid( n, num ) ) return 0;
for( int i = 0 ; i < n ; i++ ) if( num[i] > n ) all.emplace_back( num[i] );
sort( all.begin(), all.end() );
int now = n + 1;
long long ret = 1;
for( int i = 0 ; i < ( int )all.size() ; i++ ) {
ret = (ret * modpow( ( int )all.size() - 1, all[i] - now ) ) % mod;
now = v[i] + 1;
}
if( ( int )all.size() == n ) ret = ( ret * n ) % mod;
return ( int )ret;
}
// int main() {
// int n, se[100], num[100];
// scanf("%d",&n);
// for( int i = 0 ; i < n ; i++ ) scanf("%d",&num[i]);
// int x = countReplacement( n, num );
// printf("%d\n",x);
// }