Submission #1278963

#TimeUsernameProblemLanguageResultExecution timeMemory
1278963KindaGoodGamesGondola (IOI14_gondola)C++20
60 / 100
30 ms6104 KiB
#include "gondola.h" #include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> int INF = 1e9; int mod = 1e9+7; int exp(int a, int k){ if(k == 0) return 1; int res = exp(a,k/2); if(k % 2 == 0){ return (res*res)%mod; }else{ return ((((res*res)%mod)*a)%mod); } } int32_t valid(int32_t n, int32_t arr[]) { set<int> occ; for(int i = 0; i < n; i++){ if(occ.count(arr[i])){ return 0; } occ.insert(arr[i]); } pii mpos = {INF,INF}; for(int i = 0; i < n; i++){ mpos = min(mpos,{arr[i],i}); } int s = mpos.second; int cnt = mpos.first-1; for(int i = 0; i < n; i++){ int p = (s+i)%n; int ex = (cnt%n)+1; if(arr[p] <= n && ex != arr[p]){ return 0; } cnt++; } return 1; } //---------------------- int32_t replacement(int32_t n, int32_t arr[], int32_t ans[]) { vector<int> original(n); pii mpos = {INF,INF}; for(int i = 0; i < n; i++){ mpos = min(mpos,{arr[i],i}); } if(mpos.first > n) { iota(original.begin(),original.end(),1); }else{ int s = mpos.second; int cnt = mpos.first-1; for(int i = 0; i < n; i++){ int p = (s+i)%n; original[p] = (cnt%n)+1; cnt++; } } priority_queue<pii, vector<pii>, greater<pii>> pq; int pt = 0; for(int i = 0; i < n; i++){ if(arr[i] <= n) continue; pq.push({arr[i],i}); } int cur = n; vector<int> order; while(pq.size()){ int v,p; tie(v,p) = pq.top(); pq.pop(); while(cur < v){ order.push_back(p); cur++; } } int nxt = n+1; for(auto p : order){ ans[pt++] = original[p]; original[p] = nxt++; } return pt; } //---------------------- int32_t countReplacement(int32_t n, int32_t arr[]) { if(!valid(n, arr)){ return 0; } int cnt = 1; priority_queue<pii, vector<pii>, greater<pii>> pq; int pt = 0; bool f = false; for(int i = 0; i < n; i++){ if(arr[i] <= n){ f = true; continue; } pq.push({arr[i],i}); } int cmax = n; while(pq.size()){ int v,p; tie(v,p) = pq.top(); pq.pop(); int diff = v-cmax; int sz = pq.size()+1; int ch = exp(sz, diff-1); cnt *= ch; cnt %= mod; cmax = v; } if(!f) cnt *= n; cnt %= mod; return cnt; }
#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...