제출 #1027487

#제출 시각아이디문제언어결과실행 시간메모리
1027487dozer곤돌라 (IOI14_gondola)C++14
100 / 100
41 ms7532 KiB
#include "gondola.h" #include <bits/stdc++.h> using namespace std; #define sp " " #define endl "\n" #define pb push_back #define pii pair<int, int> #define st first #define nd second #define mid (l + r) / 2 #define LL node * 2 #define RR node * 2 + 1 #define fileio() freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout) #define fastio() cin.tie(0), ios_base::sync_with_stdio(0) #define ll long long #define MAXN 200005 const int modulo = 1e9+9; const ll INF = 2e18 + 7; int valid(int n, int inputSeq[]) { set<int> s; vector<int> v(n, 0); for (int i = 0; i < n; i++){ int curr = inputSeq[i]; if (curr <= n) v[i] = curr; s.insert(curr); } if (s.size() < n) return 0; int todo = -1; for (int i = 0; i < n; i++) if (v[i] != 0) todo = i; if (todo == -1) return 1; vector<int> res(n, 0); int it = todo, val = v[todo]; do{ res[it] = val; val++, it++; it %= n; val = (val - 1) % n + 1; }while(it != todo); for (int i = 0; i < n; i++) if (v[i] != 0 && res[i] != v[i]) return 0; return 1; } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]) { vector<int> v(n, 0); for (int i = 0; i < n; i++){ int curr = gondolaSeq[i]; if (curr <= n) v[i] = curr; } int todo = -1; for (int i = 0; i < n; i++) if (v[i] != 0) todo = i; vector<int> res(n, 0); int it = 0, val = 1; if (todo != -1){ it = todo, val = v[todo]; } if (todo == -1) todo = 0; do{ res[it] = val; val++, it++; it %= n; val = (val - 1) % n + 1; }while(it != todo); vector<pii> td; for (int i = 0; i < n; i++){ if (v[i] == 0){ td.pb({gondolaSeq[i], res[i]}); replacementSeq[gondolaSeq[i] - (n + 1)] = res[i]; } } if (td.empty()) return 0; sort(td.begin(), td.end()); pii tmp = td.back(); int last = tmp.nd; replacementSeq[tmp.st - (n + 1)] = 0; for (int i = n + 1; i <= tmp.st; i++){ if (replacementSeq[i - (n + 1)] == 0){ replacementSeq[i - (n + 1)] = last; last = i; } } return tmp.st - n; } //---------------------- int mul(ll a, ll b){ return (a * b) % modulo; } int add(ll a, ll b){ if (a + b < modulo) return a + b; return a + b - modulo; } int fe(ll a, ll b){ if (b == 0) return 1; if (b % 2) return mul(a, fe(a, b - 1)); ll tmp = fe(a, b / 2); return mul(tmp, tmp); } int countReplacement(int n, int inputSeq[]) { set<int> s; vector<int> v(n, 0); for (int i = 0; i < n; i++){ int curr = inputSeq[i]; if (curr <= n) v[i] = curr; s.insert(curr); } if (s.size() < n) return 0; int todo = -1; for (int i = 0; i < n; i++) if (v[i] != 0) todo = i; vector<int> res(n, 0); int it = 0, val = 1; int flag = 0; if (todo != -1){ it = todo, val = v[todo]; } if (todo == -1) flag = 1, todo = 0; do{ res[it] = val; val++, it++; it %= n; val = (val - 1) % n + 1; }while(it != todo); for (int i = 0; i < n; i++){ if (v[i] != 0 && v[i] != res[i]) return 0; } vector<int> td; for (int i = 0; i < n; i++){ if (v[i] == 0){ td.pb(inputSeq[i]); } } if (td.empty()) return 1; int ans = 1; sort(td.begin(), td.end()); int lst = n; int m = td.size(); for (int i = 0; i < m; i++){ ans = mul(ans, fe(m - i, td[i] - lst - 1)); lst = td[i]; } if (flag) ans = mul(ans, n); return ans; } /* int gondolaSequence[100001]; int replacementSequence[250001]; int main() { fileio(); int i, n, tag; int nr; assert(scanf("%d", &tag)==1); assert(scanf("%d", &n)==1); for(i=0;i< n;i++) assert( scanf("%d", &gondolaSequence[i]) ==1); switch (tag){ case 1: case 2: case 3: printf("%d\n", valid(n, gondolaSequence)); break; case 4: case 5: case 6: nr = replacement(n, gondolaSequence, replacementSequence); printf("%d ", nr); if (nr > 0) { for (i=0; i<nr-1; i++) printf("%d ", replacementSequence[i]); printf("%d\n", replacementSequence[nr-1]); } else printf("\n"); break; case 7: case 8: case 9: case 10: printf("%d\n", countReplacement(n, gondolaSequence)); break; } return 0; } */

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

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:33:18: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   33 |     if (s.size() < n) return 0;
      |         ~~~~~~~~~^~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:128:18: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  128 |     if (s.size() < n) return 0;
      |         ~~~~~~~~~^~~
#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...