Submission #679602

#TimeUsernameProblemLanguageResultExecution timeMemory
679602speedyArdaGondola (IOI14_gondola)C++14
55 / 100
47 ms6852 KiB
#include "gondola.h"
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
int freq[250005];
int used[250005];
int reve[250005];
const ll MOD = 1e9+9;
ll binpow(ll x, ll y)
{
  ll ans = 1;
  while(y > 0)
  {
    if(y & 1)
      ans = ans * x % MOD;
    x = x * x % MOD;
    y >>= 1;
  }
  return ans;
}

int valid(int n, int inputSeq[])
{
  if(n == 1)
    return 1;
  vector<pair<int, int> > originals;
  set<int> elems;
  for(int i = 0; i < n; i++)
  {
      elems.insert(i + 1);
      if(freq[inputSeq[i]] > 0)
        return 0;
      freq[inputSeq[i]]++;
      if(inputSeq[i] <= n)
      {
        originals.push_back({inputSeq[i], i});
      }
      
        
  }
  if(originals.size() <= 1) // All elements or n-1 elements are changed, so valid
    return 1; 
  int res = 1;
  originals.push_back({originals[0].first, originals[0].second + n});
  elems.erase(originals[0].first);
  int curr = (originals[0].first + 1) % (n+1), idx = originals[0].second + 1;
  if(curr == 0)
    curr++;
  for(int i = 1; i < originals.size(); i++)
  {
    //cout << res << "\n";
    while(idx < originals[i].second)
    {
      if(elems.find(curr) == elems.end())
        res = 0;
      elems.erase(curr);
      curr = (curr + 1) % (n+1);
      if(curr == 0)
        curr++;
      idx++;
    }
    

    if(curr != originals[i].first)
      res = 0;
    //elems.erase(originals[i].first);
    if(i + 1 != originals.size())
    {
      if(elems.find(originals[i].first) == elems.end())
        res = 0;
      elems.erase(originals[i].first);
    }
    //cout << res << " " << idx << " " << curr << " " << originals[i].first << "\n";
    idx++;
     curr = (curr + 1) % (n+1);
      if(curr == 0)
        curr++;
  }
  return res;
}

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

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

  int biggest = 0;
  set<int> can_be_used;
  vector<pair<int, int> > originals;
  for(int i = 0; i < n; i++)
  {
    can_be_used.insert(i + 1);
    biggest = max(biggest, gondolaSeq[i]);

    if(gondolaSeq[i] <= n)
      originals.push_back({gondolaSeq[i], i});
    //used[gondolaSeq[i]] = i;
  }
  int idx = 0, curr = 1, finishidx = -1;
  if(originals.size() > 0) // There is nonchanged element we can use for reference. Since gondolaseq is already valid (the questions states) we can assume this will provide a true intiial array (1 ..... n)
  {
    finishidx = originals[0].second;
    idx = (originals[0].second + 1) % n;
    curr = (originals[0].first + 1) % (n + 1);
    used[originals[0].first] = originals[0].first;
    reve[originals[0].first] = originals[0].first;
    if(curr == 0)
      curr++;
  }
  while(idx < n)
  {
    used[gondolaSeq[idx]] = curr;
    reve[curr] = gondolaSeq[idx];
    //if(idx == 47)
      //cout << gondolaSeq[idx] << " " << curr << " " << used[gondolaSeq[idx]] << "\n";
    curr = (curr + 1) % (n+1);
    if(curr == 0)
      curr++;
    idx++;
      
  }
  idx = 0;
  while(idx < finishidx)
  {
    used[gondolaSeq[idx]] = curr;
    reve[curr] = gondolaSeq[idx];
    curr = (curr + 1) % (n+1);
      if(curr == 0)
        curr++;
    idx++;
  }
  //cout << used[1] << "\n";
  int last = used[biggest];
  int now = n + 1;
  idx = 0;
  for(int i = 1; i <= biggest; i++)
  {
    if(i > n && (used[i] == 0 || i == biggest))
    {
      replacementSeq[idx] = last;
      last = now;
      now++;
      idx++;
    } else if(i > n)
    {
      replacementSeq[idx] = used[i];
      now++;
      idx++;
    }
  }
  
  return biggest - n;
}

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

int countReplacement(int n, int inputSeq[])
{
  return -3;
}

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:49:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   49 |   for(int i = 1; i < originals.size(); i++)
      |                  ~~^~~~~~~~~~~~~~~~~~
gondola.cpp:67:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |     if(i + 1 != originals.size())
      |        ~~~~~~^~~~~~~~~~~~~~~~~~~
#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...