Submission #308409

#TimeUsernameProblemLanguageResultExecution timeMemory
308409talant117408Gondola (IOI14_gondola)C++17
100 / 100
85 ms6160 KiB
#include "gondola.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair <int, int> pii; #define precision(n) fixed << setprecision(n) #define pb push_back #define ub upper_bound #define lb lower_bound #define mp make_pair #define eps (double)1e-9 #define PI 2*acos(0.0) #define endl "\n" #define sz(v) int((v).size()) #define all(v) v.begin(),v.end() #define rall(v) v.rbegin(),v.rend() #define do_not_disturb ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); const ll mod = 1e9+9; ll mult(ll a, ll b){ a = ((a%mod)+mod)%mod; b = ((b%mod)+mod)%mod; return (a*b)%mod; } ll binpow(ll a, ll b){ ll res = 1; while(b){ if(b&1) res = mult(res, a); a = mult(a, a); b >>= 1; } return res; } int valid(int n, int s[]){ int in = -1, flag = 1, i; map <int, int> vis; for(i = 0; i < n; i++){ if(vis[s[i]]){ flag--; break; } vis[s[i]]++; if(in == -1 && s[i] <= n){ in = s[i]; } else if(s[i] <= n && in != s[i]){ flag--; break; } in = (in == -1 ? in : (in+1 > n ? 1 : in+1)); } return flag; } //---------------------- int replacement(int n, int gon[], int repl[]){ int i, num = 0; vector <int> prev(n); iota(all(prev), 1); int in = -1, j; for(i = 0; i < n; i++){ if(in == -1 && gon[i] <= n){ in = gon[i]; j = i; break; } } if(in != -1){ for(i = j; i < n; i++){ prev[i] = in; in = (in == n ? 1 : in+1); } for(i = 0; i < j; i++){ prev[i] = in; in = (in == n ? 1 : in+1); } } vector <pii> bigger; for(i = 0; i < n; i++){ if(gon[i] > n){ bigger.pb({gon[i], i}); } } int op = n; sort(all(bigger)); for(auto to : bigger){ for(j = op; j < to.first; j++){ repl[num] = prev[to.second]; num++; prev[to.second] = j+1; } op = to.first; } return num; } //---------------------- int countReplacement(int n, int gon[]){ ll res = 1; if(!valid(n, gon)){ return 0; } vector <int> bigger; for(int i = 0; i < n; i++){ if(gon[i] > n){ bigger.pb(gon[i]); } } sort(all(bigger)); int prev = n; for(auto to : bigger){ auto it = ub(all(bigger), prev)-bigger.begin(); ll diff = to-prev-1; res = mult(res, binpow(ll(sz(bigger)-it), diff)); prev = to; } if(sz(bigger) == n) res = mult(res, n); return res; }
#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...