Submission #1282617

#TimeUsernameProblemLanguageResultExecution timeMemory
1282617repmannGondola (IOI14_gondola)C++20
75 / 100
25 ms6108 KiB
#include <bits/stdc++.h>
#define ll long long
#include "gondola.h"
using namespace std;
const int MOD = 1000000009;
inline int mul(ll x, ll y) {return ((x % MOD) * (y % MOD)) % MOD;}
inline int Power(ll x, ll y)
{
  int ret = 1;
  while(y)
  {
    if(y & 1) ret = mul(ret, x);
    x = mul(x, x);
    y >>= 1;
  }
  return ret;
}
int N;
int A[200000];
int valid(int n, int a[])
{
  N = n;
  set <int> SET;
  for(int i = 0; i < N; i++) if(!SET.insert(a[i]).second) return 0;
  for(int i = 0; i < N; i++) A[i] = A[i + N] = a[i];
  int index = 0;
  for(int i = 1; i < N; i++) if(A[i] < A[index]) index = i;
  if(A[index] > N) return 1;
  for(int i = index; i < (index + N); i++)
  {
    if((A[i] <= N) && (A[index] != (A[i] - (i - index)))) return 0;
  }
  return 1;
}
int replacement(int n, int a[], int O[])
{
  if(!valid(n, a)) return 0;
  N = n;
  for(int i = 0; i < N; i++) A[i] = A[i + N] = a[i];
  int index = 0;
  for(int i = 1; i < N; i++) if(A[i] < A[index]) index = i;
  if(A[index] <= N)
  {
    index -= A[index] - 1;
    index += (index < 0) * N;
  }
  else index = 0;
  vector <pair <int, int>> V;
  for(int i = 0; i < N; i++)
  {
    if(A[i + index] > N) V.push_back({A[i + index], i + 1});
  }
  if(!V.size()) return 0;
  sort(V.begin(), V.end());
  int cnt = N, M = 0;
  for(pair <int, int> p : V)
  {
    cnt++;
    O[M++] = p.second;
    while(cnt < p.first)
    {
      O[M++] = cnt;
      cnt++;
    }
  }
  return M;
}
int countReplacement(int n, int a[])
{
  if(!valid(n, a)) return 0;
  N = n;
  int sol = 1;
  vector <int> V;
  for(int i = 0; i < N; i++)
  {
    if(a[i] > N) V.push_back(A[i]);
  }
  if(!V.size()) return 1;
  sort(V.begin(), V.end());
  for(int i = V.size() - 2; i >= 0; i--)
  {
    sol = mul(Power(V.size() - 1 - i, V[i + 1] - V[i] - 1), sol);
  }
  sol = mul(Power(V.size(), V.front() - N - 1), sol);
  return sol;
}
//int main()
//{
//  int n;
//  cin >> n;
//  int a[n], o[100];
//  for(int i = 0; i < n; i++) cin >> a[i];
//  cout << valid(n, a) << '\n';
//  int sz = replacement(n, a, o);
//  for(int i = 0; i < sz; i++) cout << o[i] << " \n"[i == (sz - 1)];
//  cout << countReplacement(n, a) << '\n';
//}
#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...