Submission #518639

#TimeUsernameProblemLanguageResultExecution timeMemory
518639amukkalirGondola (IOI14_gondola)C++17
100 / 100
54 ms5896 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; 
  set<int> ud; 
 
  for(int i=0; i<n; i++) {
    if(inputSeq[i] <= n) {
      s = i; 
    }
    if(ud.count(inputSeq[i])) {
     // cout << " :: " << inputSeq[i] << endl; 
      return 0; 
    }
   // cout << "ud[" << inputSeq[i] << "] = 1\n"; 
    ud.insert(inputSeq[i]);
  }
 
  
  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++) {
  //   rseq[i] = ((rseq[i] + s + n) % n) + 1; 
  //   //cerr << replacementSeq[i] << " "; 
  // }

  for(int i=0; i<n; i++) {
    gondolaSeq[i] = ((i+s) % n) + 1; 
    //cout << i << " " << gondolaSeq[i] << endl; 
  }

  int cur = n+1; 
  for(int i=0; i<l; i++) {
    replacementSeq[i] = gondolaSeq[rseq[i]]; 
    gondolaSeq[rseq[i]] = cur++; 
  }
  
  //cerr << "\n";

  return l; 
}

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

ll mul (ll a, ll b) {
  a %= m; 
  b %= m;
  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; 
  int mini = INT_MAX; 
  vector<pii> v; 

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

  if(maxi == n) return 1; 
  
  ll ans = 1; 
  int ls = n;
  ll rem = n;  
  sort(v.begin(), v.end()); 
  for(int i=0; i<v.size(); i++) {
    if(v[i].fi > n) {
      ans = mul(ans, binpow(rem, v[i].fi - ls - 1)); 
      ls = v[i].fi; 
    }

    rem--; 
//    cout << i << " " << ans << endl; 
  }
  
  if(mini > n) ans = mul(ans, n); 

  return ans;
}

/*
replacement seq is a permutation of maxi - n numbers 
there are 2 cases : 
all of them is greater than n 
  

at least one of them <= n

*/

Compilation message (stderr)

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:133:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  133 |   for(int i=0; i<v.size(); i++) {
      |                ~^~~~~~~~~
#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...