Submission #516739

#TimeUsernameProblemLanguageResultExecution timeMemory
516739amukkalirGondola (IOI14_gondola)C++17
45 / 100
396 ms3152 KiB
#include "gondola.h"
#include <bits/stdc++.h>
using namespace std; 
typedef long long ll; 
#define pii pair<int,int> 
#define fi first 
#define se second 
#define pb push_back

int valid(int n, int inputSeq[])
{
  int s = -1; 
  bitset<250001> ud; 
 
  for(int i=0; i<n; i++) {
    if(inputSeq[i] <= n) {
      s = i; 
    }
    if(ud[inputSeq[i]]) {
     // cout << " :: " << inputSeq[i] << endl; 
      return 0; 
    }
   // cout << "ud[" << inputSeq[i] << "] = 1\n"; 
    ud[inputSeq[i]] = 1; 
  }
 
  
  if(s != -1) {
    int val = inputSeq[s]-1; 
    s--; 
    for(int i=0; i<n; i++) {
      s = (s+1)%n; 
      val = ((val) % n) + 1; 
      cerr << inputSeq[s] << " " << val << endl; 
      if(inputSeq[s] <= n && inputSeq[s] != val) return 0; 
    }
  } 
 
  return 1; 
}

//----------------------

int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
  int l = 0; 
  vector<pair<int,int>> gseq;
  vector<int> rseq; 

  for(int i=0; i<n; i++) {
    gseq.push_back({gondolaSeq[i], i}); 
  }

  gseq.pb({n, n}); 
  sort(gseq.begin(), gseq.end(), greater<pii>()); 
  
  int t = 0; 
  for(int i = 0; i<n && gseq[i].fi > n; i++) {
    //cout << i << " " << gseq[i].fi << endl; 
    t = gseq[i].fi - gseq[i+1].fi; 
    while(t--) rseq.pb(gseq[i].se); 
  }

  int s = 0; 
  for(int i = 0; i<n; i++) {
    if(gondolaSeq[i] <= n) {
      s = gondolaSeq[i] - i - 1; 
      break; 
    }
  }

  l = rseq.size(); 
  reverse(rseq.begin(), rseq.end()); 
  for(int i=0; i<l; i++) {
    replacementSeq[i] = ((rseq[i] + s + n) % n) + 1; 
    //cerr << replacementSeq[i] << " "; 
  }
  //cerr << "\n";

  return l; 
}

//----------------------
const int m = 1e9+9; 

ll mul (ll a, ll b) {
  return (a*b) % m; 
}

ll binpow(ll a, ll b) {
  ll ret = 1; 
  while(b) {
    if(b&1) ret = mul(a, ret); 
    a = mul(a, a); 
    b >>= 1; 
  }
  return ret; 
}

int countReplacement(int n, int inputSeq[])
{
  if(!valid(n, inputSeq)) return 0; 
  int maxi = 0; 
  vector<pii> v; 

  for(int i=0; i<n; i++) {
    v.push_back({inputSeq[i], i}); 
    maxi = max(maxi, inputSeq[i]); 
  }

  if(maxi == n) return 1; 

  v.push_back({n, n}); 
  ll ans = 1; 
  sort(v.begin(), v.end(), greater<pii> ()); 
  for(int i=0; i<n && v[i].fi > n; i++) {
    ll dif = v[i].fi - v[i+1].fi; 
    ans = mul(ans, binpow(i+1, dif-1)); 
  }

  return ans;
}
#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...