Submission #722647

#TimeUsernameProblemLanguageResultExecution timeMemory
722647Yell0Gondola (IOI14_gondola)C++17
55 / 100
19 ms2300 KiB
#include <bits/stdc++.h>
#include "gondola.h"
 
using namespace std;
typedef long long ll;
const int MOD=1e9+9;
 
int valid(int n,int inputSeq[]) {
  int st=-1;
  vector<int> ogIdx(n+2);
  set<int> usedNew;
  for(int i=0;i<n;++i) {
    if(st<0&&inputSeq[i]<=n) {
      st=i;
      ogIdx[inputSeq[i]]=i;
      for(int j=1;j<n;++j) ogIdx[(inputSeq[i]-1+j)%n+1]=j;
    } else if(inputSeq[i]<=n) {
      if(ogIdx[inputSeq[i]]!=i) return 0;
    } else {
      if(usedNew.count(inputSeq[i])) return 0;
      usedNew.insert(inputSeq[i]);
    }
  }
  return 1;
}
 
int replacement(int n,int gondolaSeq[],int replacementSeq[]) {
  vector<pair<int,int>> news;
  vector<int> og(n);
  for(int i=0;i<n;++i) if(gondolaSeq[i]>n) news.push_back({gondolaSeq[i],i});
  sort(news.begin(),news.end());
  bool f=0;
  for(int i=0;i<n;++i) {
    if(gondolaSeq[i]<=n) {
      f=1;
      og[i]=gondolaSeq[i];
      for(int j=1;j<n;++j) og[(i+j)%n]=(og[i]-1+j)%n+1;
      break;
    }
  }
  if(!f) for(int i=0;i<n;++i) og[i]=i+1;
  int repi=0,currRep=n;
  for(int i=0;i<news.size();++i) {
    replacementSeq[repi++]=og[news[i].second];
    ++currRep;
    while(currRep<news[i].first) replacementSeq[repi++]=currRep++;
  }
  return repi;
}

int countReplacement(int n,int inputSeq[]) {
  if(!valid(n,inputSeq)) return 0;

  vector<int> news;
  for(int i=0;i<n;++i) if(inputSeq[i]>n) news.push_back(inputSeq[i]);
  sort(news.begin(),news.end());

  auto qpow=[&](ll x,int e) {
    ll res=1,mult=x;
    for(int i=0;1<<i<=e;++i) {
      if((1LL<<i)&e) res=res*mult%MOD;
      mult=mult*mult%MOD;
    }
    return res;
  };

  ll ans=(news.size()==n?n:1);
  int prev=n;
  for(int i=0;i<news.size();++i) {
    ans=ans*qpow(news.size()-i,news[i]-prev-1)%MOD;
    prev=news[i];
  }
  return ans%MOD;
}

Compilation message (stderr)

gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:43:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |   for(int i=0;i<news.size();++i) {
      |               ~^~~~~~~~~~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:67:22: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   67 |   ll ans=(news.size()==n?n:1);
      |           ~~~~~~~~~~~^~~
gondola.cpp:69:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |   for(int i=0;i<news.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...