Submission #409098

#TimeUsernameProblemLanguageResultExecution timeMemory
409098pliamGondola (IOI14_gondola)C++14
100 / 100
35 ms3752 KiB
#include "gondola.h"
#include <bits/stdc++.h>
using namespace std;
#define MOD 1000000009
typedef long long ll;
//valid
vector<pair<int,int>> input;//(val,id)
vector<pair<int,int>> rep;//(val,id)
vector<ll> ext;//val (only)

int valid(int n, int inputSeq[])
{
  input.clear();
  for(int i=0;i<n;i++){
    input.push_back({inputSeq[i],i});
  }
  sort(input.begin(),input.end());
  int prev=-1;
  for(int i=0;i<n;i++){
    if(input[i].first==prev) return 0;
    prev=input[i].first;
  }
  int prev_pos=-1;
  for(int i=0;i<n&&input[i].first<=n;i++){
    if((i!=0)&&((input[i].first-prev)!=((input[i].second-prev_pos+n)%n))){
      return 0;
    }
    prev=input[i].first;
    prev_pos=input[i].second;
  }
  return 1;
}

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

int mod1(int x,int m){
  x%=m;
  if(x==0) x=m;
  return x;
}

int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
  rep.clear();
  int extra=0;
  for(int i=0;i<n;i++){
    if(gondolaSeq[i]>n) rep.push_back({gondolaSeq[i],i});
    else extra=(gondolaSeq[i]-i+n)%n;
  }
  for(auto& p:rep){
    p.second+=extra;
    p.second=mod1(p.second,n);
  }
  sort(rep.begin(),rep.end());
  int l=0;
  int prev=n;
  for(auto p:rep){
    replacementSeq[l]=p.second;
    l++;
    for(int i=prev+1;i<p.first;i++){
      replacementSeq[l]=i;
      l++;
    }
    prev=p.first;
  }
  return l;
}

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

ll binpow(ll a,ll b){
  ll ans=1;
  while(b>0){
    if(b&1) ans=(ans*a)%MOD;
    a=(a*a)%MOD;
    b/=2;
  }
  return ans;
}

int countReplacement(int n, int inputSeq[])
{
  ext.clear();
  if(!valid(n,inputSeq)) return 0;
  for(int i=0;i<n;i++){
    if(inputSeq[i]>n) ext.push_back(inputSeq[i]);
  }
  sort(ext.begin(),ext.end());
  ll prev=n;
  ll res=1;
  for(int i=0;i<ext.size();i++){
    res=(res*binpow(ext.size()-i,ext[i]-prev-1))%MOD;
    prev=ext[i];
  }
  /*
  if(ext.size()==n){//multiply by n!
    for(int i=1;i<=n;i++){
      res=(res*i)%MOD;
    }
  }
  */

  if(ext.size()==n) res=(res*n)%MOD;
  
  return res;
}

Compilation message (stderr)

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:91:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |   for(int i=0;i<ext.size();i++){
      |               ~^~~~~~~~~~~
gondola.cpp:103:16: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  103 |   if(ext.size()==n) res=(res*n)%MOD;
      |      ~~~~~~~~~~^~~
#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...