제출 #518639

#제출 시각아이디문제언어결과실행 시간메모리
518639amukkalir곤돌라 (IOI14_gondola)C++17
100 / 100
54 ms5896 KiB
#include "gondola.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; #define pii pair<int,int> #define fi first #define se second #define pb push_back int valid(int n, int inputSeq[]) { int s = -1; set<int> ud; for(int i=0; i<n; i++) { if(inputSeq[i] <= n) { s = i; } if(ud.count(inputSeq[i])) { // cout << " :: " << inputSeq[i] << endl; return 0; } // cout << "ud[" << inputSeq[i] << "] = 1\n"; ud.insert(inputSeq[i]); } if(s != -1) { int val = inputSeq[s]-1; s--; for(int i=0; i<n; i++) { s = (s+1)%n; val = ((val) % n) + 1; //cerr << inputSeq[s] << " " << val << endl; if(inputSeq[s] <= n && inputSeq[s] != val) return 0; } } return 1; } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]) { int l = 0; vector<pair<int,int>> gseq; vector<int> rseq; for(int i=0; i<n; i++) { gseq.push_back({gondolaSeq[i], i}); } gseq.pb({n, n}); sort(gseq.begin(), gseq.end(), greater<pii>()); int t = 0; for(int i = 0; i<n && gseq[i].fi > n; i++) { //cout << i << " " << gseq[i].fi << endl; t = gseq[i].fi - gseq[i+1].fi; while(t--) rseq.pb(gseq[i].se); } int s = 0; for(int i = 0; i<n; i++) { if(gondolaSeq[i] <= n) { s = gondolaSeq[i] - i - 1; break; } } l = rseq.size(); reverse(rseq.begin(), rseq.end()); // for(int i=0; i<l; i++) { // rseq[i] = ((rseq[i] + s + n) % n) + 1; // //cerr << replacementSeq[i] << " "; // } for(int i=0; i<n; i++) { gondolaSeq[i] = ((i+s) % n) + 1; //cout << i << " " << gondolaSeq[i] << endl; } int cur = n+1; for(int i=0; i<l; i++) { replacementSeq[i] = gondolaSeq[rseq[i]]; gondolaSeq[rseq[i]] = cur++; } //cerr << "\n"; return l; } //---------------------- const int m = 1e9+9; ll mul (ll a, ll b) { a %= m; b %= m; return (a*b) % m; } ll binpow(ll a, ll b) { ll ret = 1; while(b) { if(b&1) ret = mul(a, ret); a = mul(a, a); b >>= 1; } return ret; } int countReplacement(int n, int inputSeq[]) { if(!valid(n, inputSeq)) return 0; int maxi = 0; int mini = INT_MAX; vector<pii> v; for(int i=0; i<n; i++) { v.push_back({inputSeq[i], i}); maxi = max(maxi, inputSeq[i]); mini = min(mini, inputSeq[i]); } if(maxi == n) return 1; ll ans = 1; int ls = n; ll rem = n; sort(v.begin(), v.end()); for(int i=0; i<v.size(); i++) { if(v[i].fi > n) { ans = mul(ans, binpow(rem, v[i].fi - ls - 1)); ls = v[i].fi; } rem--; // cout << i << " " << ans << endl; } if(mini > n) ans = mul(ans, n); return ans; } /* replacement seq is a permutation of maxi - n numbers there are 2 cases : all of them is greater than n at least one of them <= n */

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

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:133:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  133 |   for(int i=0; i<v.size(); i++) {
      |                ~^~~~~~~~~
#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...