제출 #106288

#제출 시각아이디문제언어결과실행 시간메모리
106288popovicirobert곤돌라 (IOI14_gondola)C++14
100 / 100
91 ms10300 KiB
#include "gondola.h" #include <bits/stdc++.h> using namespace std; const int MOD = (int) 1e9 + 9; const int INF = (int) 1e9; int valid(int n, int inputSeq[]) { int id = 0, pos; map <int, bool> mp; for(int i = 0; i < n; i++) { if(mp[inputSeq[i]] == 1) { return 0; } mp[inputSeq[i]] = 1; if(inputSeq[i] <= n) { id = inputSeq[i]; pos = i; } } if(id != 0) { int cur = id; int i = pos; do { if(inputSeq[i] <= n && inputSeq[i] != cur) { return 0; } cur++; if(cur == n + 1) { cur = 1; } i = (i + 1) % n; }while(i != pos); } return 1; } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]) { vector <int> positions; for(int i = 0; i < n; i++) { if(gondolaSeq[i] > n) { positions.push_back(i); } } sort(positions.begin(), positions.end(), [&](const int &a, const int &b) { return gondolaSeq[a] < gondolaSeq[b]; }); map <int, int> mp; int id = 0, pos, mx = 0; for(int i = 0; i < n; i++) { mp[gondolaSeq[i]] = i + 1; mx = max(mx, gondolaSeq[i]); if(gondolaSeq[i] <= n) { id = gondolaSeq[i]; pos = i; } } vector <int> ord(n); iota(ord.begin(), ord.end(), 1); if(id != 0) { int i = pos; do { ord[i] = id; id++; if(id == n + 1) { id = 1; } i = (i + 1) % n; }while(i != pos); } pos = 0; int sz = 0; for(int i = n + 1; i <= mx; i++) { replacementSeq[sz++] = ord[positions[pos]]; ord[positions[pos]] = i; if(mp[i] > 0) { pos++; } } return sz; } //---------------------- inline int lgput(int a, int b) { int ans = 1; while(b > 0) { if(b & 1) ans = (1LL * ans * a) % MOD; b >>= 1; a = (1LL * a * a) % MOD; } return ans; } int countReplacement(int n, int inputSeq[]) { if(!valid(n, inputSeq)) { return 0; } vector <int> vals; int cnt = 0; for(int i = 0; i < n; i++) { if(inputSeq[i] > n) { cnt++; vals.push_back(inputSeq[i]); } } sort(vals.begin(), vals.end()); int ans = 1, last = n; for(auto it : vals) { ans = (1LL * ans * lgput(cnt, it - last - 1)) % MOD; last = it; cnt--; } if(vals.size() == n) { ans = (1LL * ans * n) % MOD; } return ans; }

컴파일 시 표준 에러 (stderr) 메시지

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:134:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(vals.size() == n) {
        ~~~~~~~~~~~~^~~~
#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...