# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
292234 | stoyan_malinin | Gondola (IOI14_gondola) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "gondola.h"
//#include "grader.cpp"
#include <set>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 3e5 + 5;
namespace Valid
{
bool seen[MAXN];
bool sortedL[MAXN], sortedR[MAXN];
void fillSeen(int n, int a[], int maxVal)
{
for(int i = 0;i<=maxVal;i++)
{
seen[i] = false;
}
for(int i = 0;i<n;i++)
{
seen[ a[i] ] = true;
}
}
bool check(int n, int a[], int relevant)
{
int maxVal = 0;
for(int i = 0;i<n;i++)
{
maxVal = max(maxVal, a[i]);
sortedL[i] = sortedR[i] = false;
}
for(int i = 0;i<=maxVal;i++)
{
seen[i] = false;
}
for(int i = 0;i<n;i++)
{
if(seen[ a[i] ]==true) return false;
seen[ a[i] ] = true;
}
sortedL[0] = true;
for(int i = 1;i<n;i++)
{
if(a[i]>relevant) sortedL[i] = sortedL[i-1];
else sortedL[i] = (sortedL[i-1]&(a[i-1]<a[i]));
}
sortedR[n-1] = true;
for(int i = n-2;i>=0;i--)
{
if(a[i]>relevant) sortedR[i] = sortedR[i+1];
else sortedR[i] = (sortedR[i+1]&(a[i]<a[i+1]));
}
if(sortedL[n-1]==true && (a[n-1]==n || (a[n-1]>relevant && seen[n]==false))) return true;
for(int i = 0;i<n-1;i++)
{
if(sortedL[i]==true && sortedR[i+1]==true)
{
if(a[i]>relevant || a[i+1]>relevant)
{
if((a[i]>relevant && seen[n]==false) && (a[i+1]>relevant && seen[1]==false))
{
return true;
}
}
else
{
if(a[i]==n && a[i+1]==1)
{
return true;
}
}
}
}
return false;
}
};
namespace Replacement
{
vector <int> constructSlow(int n, int a[])
{
int maxVal = 0;
for(int i = 0;i<n;i++) maxVal = max(maxVal, a[i]);
vector <int> answer;
for(int num = maxVal;num>=n+1;num--)
{
int ind = -1;
for(int i = 0;i<n;i++)
{
if(a[i]==num)
{
ind = i;
break;
}
}
Valid::fillSeen(n, a, num);
for(int x = num-1;x>=1;x--)
{
if(Valid::seen[x]==false)
{
a[ind] = x;
if(Valid::check(n, a, num-1)==true)
{
answer.push_back(x);
break;
}
a[ind] = num;
}
}
}
reverse(answer.begin(), answer.end());
return answer;
}
};
int valid(int n, int inputSeq[])
{
return Valid::check(n, inputSeq, n);
}
//----------------------
int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
vector <int> answer = Replacement::constructSlow(n, gondolaSeq);
for(int i = 0;i<answer.size();i++)
{
replacementSeq[i] = answer[i];
assert(answer[i]<=n+i);
}
return answer.size();
}
//----------------------
int countReplacement(int n, int inputSeq[])
{
return -3;
}