Submission #1332570

#TimeUsernameProblemLanguageResultExecution timeMemory
1332570DeltaStructGondola (IOI14_gondola)C++20
100 / 100
35 ms5228 KiB
#include <bits/stdc++.h>
using namespace std;
#include "gondola.h"

int valid(int n,int A[]){
  int x = min_element(A,A+n)-A;
  for (int i((x+1)%n),k(1);i!=x;++i%=n,++k) if (A[i]<=n&&A[x]+k!=A[i]) return 0;
  set<int> S(A,A+n);
  return (S.size()==n);
}

int replacement(int n,int A[],int R[]){
  int x = min_element(A,A+n)-A;
  vector<int> B(A,A+n);
  if (A[x]<=n){
    int y = x-A[x]+1;
    if (y<0) y += n;
    for (int i(0);i < n;++i) B[(y+i)%n] = i+1;
  } else iota(B.begin(),B.end(),1);
  map<int,int> M; for (int i(0);i < n;++i) M[A[i]] = i;
  int y = max_element(A,A+n)-A;
  for (int i(n+1);i <= A[y];++i){
    if (M.contains(i)) R[i-n-1] = exchange(B[M[i]],i);
    else R[i-n-1] = exchange(B[y],i);
  }
  return A[y]-n;
}

int countReplacement(int n, int A[]){
  if (!valid(n,A)) return 0;
  long long mod = 1e9+9;
  auto modpow = [&](long long x,long long y) -> long long {
    long long res(1);
    for (;y;y>>=1,(x*=x)%=mod) if (y&1) (res*=x)%=mod;
    return res;
  };
  vector<int> B;
  for (int i(0);i < n;++i) B.emplace_back(max(A[i]-n,0));
  sort(B.begin(),B.end());
  long long res(1);
  for (int i(1);i < n;++i) if (B[i]) (res *= modpow(n-i,B[i]-B[i-1]-1)) %= mod;
  if (B[0]){
    (res *= modpow(n,B[0])) %= mod;
  }
  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...