Submission #1063739

#TimeUsernameProblemLanguageResultExecution timeMemory
1063739pawnedGondola (IOI14_gondola)C++17
100 / 100
42 ms7508 KiB
#pragma GCC optimize("O1,O2,O3,Ofast,unroll-loops") #include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back typedef long long ll; typedef pair<ll, ll> ii; typedef vector<ll> vi; #include "gondola.h" const ll MOD = 1e9 + 9; ll nr(ll x) { x %= MOD; x += MOD; x %= MOD; return x; } ll binpow(ll x, ll y) { x = nr(x); ll res = 1; while (y > 0) { if (y % 2 == 1) res = nr(res * x); x = nr(x * x); y /= 2; } return res; } int valid(int N, int inputSeq[]) { vi a; for (int i = 0; i < N; i++) { a.pb(inputSeq[i] - 1); } int fpos = -1; // fixed position int fval = -1; // fixed val at position for (int i = 0; i < N; i++) { if (a[i] < N) { fpos = i; fval = a[i]; } } vi b; if (fval > fpos) { int s = fval - fpos; for (int i = N - s; i < N; i++) { b.pb(a[i]); } for (int i = 0; i < N - s; i++) { b.pb(a[i]); } } else { int s = fpos - fval; for (int i = s; i < N; i++) { b.pb(a[i]); } for (int i = 0; i < s; i++) { b.pb(a[i]); } } for (int i = 0; i < N; i++) { if (b[i] < N) { if (b[i] != i) return 0; } } // all values must be diff set<int> allv; for (int x : b) allv.insert(x); if (allv.size() != N) return 0; return 1; } int replacement(int N, int gondolaSeq[], int replacementSeq[]) { vi a; for (int i = 0; i < N; i++) { a.pb(gondolaSeq[i] - 1); } int fpos = -1; // fixed position int fval = -1; // fixed val at position for (int i = 0; i < N; i++) { if (a[i] < N) { fpos = i; fval = a[i]; } } vi b; if (fpos == -1) { b = a; } else if (fval > fpos) { int s = fval - fpos; for (int i = N - s; i < N; i++) { b.pb(a[i]); } for (int i = 0; i < N - s; i++) { b.pb(a[i]); } } else { int s = fpos - fval; for (int i = s; i < N; i++) { b.pb(a[i]); } for (int i = 0; i < s; i++) { b.pb(a[i]); } } /* cout<<"b: "; for (int x : b) cout<<x<<" "; cout<<endl;*/ // replace 0, 1, ..., N - 1 with b vector<ii> rep; for (int i = 0; i < N; i++) { if (b[i] != i) rep.pb({b[i], i}); } sort(rep.begin(), rep.end()); /* cout<<"rep: "; for (ii p : rep) cout<<"("<<p.fi<<", "<<p.se<<"); "; cout<<endl;*/ if (rep.size() == 0) { // just 0 to N - 1 return 0; } int curr = N - 1; vi ans; for (int i = 0; i < rep.size(); i++) { ans.pb(rep[i].se); for (int j = curr + 1; j < rep[i].fi; j++) { ans.pb(j); } curr = rep[i].fi; } int K = ans.size(); for (int i = 0; i < K; i++) { replacementSeq[i] = ans[i] + 1; } return K; } int countReplacement(int N, int inputSeq[]) { if (!valid(N, inputSeq)) return 0; vi a; for (int i = 0; i < N; i++) { a.pb(inputSeq[i] - 1); } vi pr; // those over N - 1 for (int i = 0; i < N; i++) { if (a[i] > N - 1) pr.pb(a[i]); } pr.pb(N - 1); sort(pr.begin(), pr.end()); /* cout<<"pr: "; for (int x : pr) cout<<x<<" "; cout<<endl;*/ int K = pr.size(); ll ans = 1; for (int i = 0; i < K - 1; i++) { ll diff = pr[i + 1] - pr[i] - 1; ans = nr(ans * binpow(K - i - 1, diff)); } if (K == N + 1) ans = nr(ans * N); return (int)(ans); }

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:78:18: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   78 |  if (allv.size() != N)
      |      ~~~~~~~~~~~~^~~~
gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:138:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  138 |  for (int i = 0; i < rep.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...