Submission #1364413

#TimeUsernameProblemLanguageResultExecution timeMemory
1364413AgageldiGondola (IOI14_gondola)C++20
100 / 100
42 ms9796 KiB
#include "bits/stdc++.h"
// #include "grader.h"
#include "gondola.h"
using namespace std;

#define N 500005

const int M = 1e9 + 9;

int a[N], b[N], vis[N], f[N], D[N];
set <long long> g ={}, h = {}, gg;
vector <int> v;
bool check(int x,int ch) {
  if(!ch) {
    if((int)g.size() != x ||(int)h.size() > 1) return 0;
    if((int)h.size() == 0) return 1;
  }
  int val = *h.begin();
  for(int i = 1; i <= x; i++) {
    int pos = i;
    if(i <= val) pos += x;
    b[pos - val - 1] = i;
  }
  for(int i = 0; i < x; i++) {
    if(a[i] > x) continue;
    if(a[i] != b[i]) return 0;
  }
  return 1;
}

int valid(int n, int inputSeq[]) {
  for(int i = 0; i < n; i++) {
    a[i] = inputSeq[i];
    g.insert(a[i]);
    if(a[i] < n) {
      if(a[i] >= i + 1) h.insert(a[i] - (i + 1));
      else h.insert((n + a[i]) - (i + 1));
    }
  }
  return check(n, 0);
}


int replacement(int n, int gondolaSeq[], int replacementSeq[])
{

  for(int i = 0; i < n; i++) {
    a[i] = gondolaSeq[i];
    b[i] = i + 1;
    g.insert(a[i]);
    vis[a[i]] = 1;
    if(a[i] < n) {
      if(a[i] >= i + 1) h.insert(a[i] - (i + 1));
      else h.insert((n + a[i]) - (i + 1));
    }
  }
  set <pair <int,int>> st;
  int x = check(n, 1);
  int sz = 0, ls = n + 1;
  for(int i = 0; i < n; i++) {
    assert(b[i] >= 1 && b[i] <= n);
    if(a[i] != b[i]) st.insert({a[i], b[i]});
  }
  while(!st.empty()){
    auto ii = *st.begin();
    int ap = ii.second, ak = ii.first;
    replacementSeq[sz++] = ap;
    while(ls != ak) {
      replacementSeq[sz++] = ls++;
    }
    ls++;
    st.erase(st.begin());
  }
  return sz;
}
long long calc(long long x,long long y){
  if(!y) return 1;
  long long F = calc(x, y / 2)%M;
  return F * F % M * (y % 2 != 0 ? x : 1) % M;
} 

int countReplacement(int n, int inputSeq[])
{
  for(int i = 0; i < n; i++) {
    a[i] = inputSeq[i];
    g.insert(a[i]);
    if(a[i] <= n) {
      if(a[i] >= i + 1) h.insert(a[i] - (i + 1));
      else h.insert((n + a[i]) - (i + 1));
    }
    else gg.insert(a[i]);
  }
  if(!check(n,0)) return 0;
  long long d = (int)gg.size(), ans = 1;
  if(d == 0) return 1;
  if(d == n) ans = n;
  long long ls = n, i = 0;
  while(!gg.empty()) {
    int vl = *gg.begin();
    ans = (long long)1 * ans % M * calc(d - i, vl - ls - 1) % M;
    ls = vl;
    i++;
    gg.erase(gg.begin());
  }
  int answer = ans % M;
  return answer;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...