제출 #705286

#제출 시각아이디문제언어결과실행 시간메모리
705286ThegeekKnight16곤돌라 (IOI14_gondola)C++17
100 / 100
77 ms12580 KiB
#include <bits/stdc++.h> #include "gondola.h" using namespace std; typedef long long int ll; const ll MOD = 1000000009; const int MAXN = 1e5 + 10; ll expect[MAXN]; map<ll, int> marc; ll mult(ll a, ll b) { a %= MOD; b %= MOD; return ((a * b) % MOD); } ll exp(ll x, ll n) { x %= MOD; n %= MOD; if (n == 0LL) return 1LL; if (n == 1LL) return x; if (n % 2LL) return mult(x, exp(x, n-1LL)); return exp(mult(x, x), n/2LL); } int valid(int n, int inputSeq[]) { for (int i = 0; i < n; i++) { if (marc[inputSeq[i]]) return 0; marc[inputSeq[i]] = 1; } bool Achei = false; for (int i = 0; i < n; i++) { if (!Achei && inputSeq[i] > n) continue; else if (!Achei && inputSeq[i] <= n) { expect[i] = inputSeq[i]; Achei = true; } else if (Achei) expect[i] = (expect[i-1]+1LL); if (expect[i] > n) expect[i] -= n; } if (!expect[0]) expect[0] = expect[n-1]+1LL; if (expect[0] > n) expect[0] -= n; for (int i = 1; i < n && !expect[i]; i++) { expect[i] = expect[i-1]+1LL; if (expect[i] > n) expect[i] -= n; } for (int i = 0; i < n; i++) { if (inputSeq[i] > n) continue; if (expect[i] != inputSeq[i]) return 0; } return 1; } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]) { if (!valid(n, gondolaSeq)) return 0; int tam = 0; ll atual = n+1; set<tuple<ll, ll, ll> > fora; for (int i = 0; i < n; i++) if (gondolaSeq[i] > n) fora.emplace(gondolaSeq[i], expect[i], i); while (!fora.empty()) { auto [quero, tenho, id] = *fora.begin(); fora.erase(fora.begin()); replacementSeq[tam++] = tenho; if (atual < quero) fora.emplace(quero, atual, id); atual++; } return tam; } //---------------------- int countReplacement(int n, int inputSeq[]) { // cerr << "ABA" << '\n'; if (!valid(n, inputSeq)) return 0; set<ll> fora; // cerr << "CABA" << '\n'; for (int i = 0; i < n; i++) if (inputSeq[i] > n) fora.emplace(inputSeq[i]); ll atual = n+1; ll resp = 1LL; if (fora.size() == n) resp = n; // cerr << "SABA" << '\n'; while (!fora.empty()) { resp = mult(resp, exp((long long)fora.size(), *fora.begin() - atual)); atual = (*fora.begin()); atual++; assert(resp > 0); assert(atual > 0); // cerr << atual << '\n'; fora.erase(fora.begin()); } // cerr << "VABA" << '\n'; return (int)(resp % MOD); }

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

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:96:21: warning: comparison of integer expressions of different signedness: 'std::set<long long int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   96 |     if (fora.size() == n) resp = 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...