제출 #396829

#제출 시각아이디문제언어결과실행 시간메모리
396829bigg곤돌라 (IOI14_gondola)C++14
100 / 100
101 ms11252 KiB
#include "gondola.h" #include<bits/stdc++.h> using namespace std; const int MAXN = 1e5 + 10; map<int, int> freq; int nseq[2*MAXN]; typedef long long ll; const ll MOD = 1e9 + 9; int valid(int n, int inputSeq[]) { // int ult = 0; for(int i = 0; i < n; i++){ nseq[i+1] = nseq[i+n+1] = inputSeq[i]; freq[inputSeq[i]]++; if(freq[inputSeq[i]] == 2) return 0; } int ini = 0, auxi = n + 1; for(int i = 1; i <= n; i++){ if(nseq[i] <= n && nseq[i] < auxi) ini = i, auxi = nseq[i]; // printf("%d %d\n", nseq[i], auxi); } //printf("\n"); //printf("%d\n",ini); if(!ini) return 1; int ult = auxi, ultaux = ini; for(int i = ini+1; i < ini + n; i++){ if(nseq[i] <= n){ // printf("%d %d\n", nseq[i], ult ); if(nseq[i] <= ult ||nseq[i] - ult != i - ultaux) return 0; ult = nseq[i]; ultaux = i; } } return 1; } //---------------------- set<pair<int, int> > s; vector<int> v; int replacement(int n, int gondolaSeq[], int replacementSeq[]) { for(int i = 0; i < n; i++){ nseq[i+1] = nseq[i+n+1] = gondolaSeq[i]; freq[gondolaSeq[i]]++; } int ini = 0, auxi = n + 1; for(int i = 1; i <= n; i++){ if(nseq[i] <= n && nseq[i] < auxi) ini = i, auxi = nseq[i]; //printf("%d ", nseq[i]); } ini = (ini - auxi + 1 > 0) ? ini-auxi+1 : n + ini -auxi + 1; //printf("\n"); if(ini == 0) ini = 1, auxi = 1; for(int i = ini; i <= ini + n - 1; i++){ //printf("%d %d\n", i, nseq[i]); if(nseq[i] <= n) continue; s.insert({nseq[i],i-ini+1}); //printf("aaan"); } int act = n; while(!s.empty()){ set <pair<int, int> > :: iterator it = s.begin(); v.push_back(it->second); int f = (*s.begin()).first; int sec = (*s.begin()).second; s.erase({f,sec}); act++; if(f == act) continue; s.insert({f,act}); } for(int i = 0; i < v.size(); i++) replacementSeq[i] = v[i]; return v.size(); } ll fexp(ll b, ll e){ if(e == 0) return 1; if(e == 1) return b; ll aux = fexp(b, e/2); aux*=aux; aux%=MOD; if(e%2) aux *= b; aux %= MOD; return aux; } //---------------------- //map<int, int> suf; int countReplacement(int n, int inputSeq[]) { if(!valid(n, inputSeq)) return 0; for(int i = 1; i <= n; i++){ s.insert({nseq[i],i-1}); //printf("%d ", nseq[i]); } bool flag = true; ll ans = 1; ll big = n; bool ok = 1; int act = n + 1; while(!s.empty()){ pair<int,int> p = *(s.begin()); if(p.first <= n){ ok = false; big--; s.erase(s.begin()); continue; } ll aux = p.first - act; ans *= fexp(big, aux); ans %= MOD; act = p.first + 1; big--; s.erase(s.begin()); } if(ok) ans *= n, ans %= MOD; return ans; }

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

gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:78:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |  for(int i = 0; i < v.size(); i++) replacementSeq[i] = v[i];
      |                 ~~^~~~~~~~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:107:7: warning: unused variable 'flag' [-Wunused-variable]
  107 |  bool flag = true;
      |       ^~~~
#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...