# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
541463 | Mdominykas | 곤돌라 (IOI14_gondola) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#include "grader.h"
using namespace std;
int valid(int n, int inputSeq[])
{
set<int> difCount;
for(int i = 0; i < n; i++)
{
if(inputSeq[i] <= n)
{
difCount.insert((inputSeq[i] + n - i - 1) % n);
}
}
vector<int> sortedSeq;
for(int i = 0; i < n; i++)
sortedSeq.push_back(inputSeq[i]);
sort(sortedSeq.begin(), sortedSeq.end());
sortedSeq.erase(unique(sortedSeq.begin(), sortedSeq.end()), sortedSeq.end());
if(sortedSeq.size() != n)
return 0;
if(difCount.size() > 0)
{
assert(*difCount.rbegin() < n);
}
if(difCount.size() > 1)
return 0;
return 1;
}
//----------------------
int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
assert(n != 0);
if(!valid(n, gondolaSeq))
return 0;
vector<int> current, goal;
for(int i = 0; i < n; i++)
{
goal.push_back(gondolaSeq[i]);
current.push_back(i + 1);
}
int diff = 0;
for(int i = 0; i < n; i++)
{
if(gondolaSeq[i] <= n)
{
diff = gondolaSeq[i] - (i + 1);
break;
}
}
// cout << "diff = " << diff << endl;
for(int i = 0; i < n; i++)
{
current[i] += diff;
if(current[i] > n)
current[i] -= n;
if(current[i] <= 0)
current[i] += n;
}
vector<pair<int, int> > sortedGoal;
for(int i = 0; i < n; i++)
{
if(goal[i] > n)
sortedGoal.push_back(make_pair(goal[i], i));
}
sort(sortedGoal.begin(), sortedGoal.end());
int l = 0;
int cur = n + 1;
for(int i = 0; i < sortedGoal.size(); i++)
{
while(current[sortedGoal[i].second] < sortedGoal[i].first)
{
replacementSeq[l] = current[sortedGoal[i].second];
l++;
current[sortedGoal[i].second] = cur;
cur++;
}
}
// cout << "gale l yra: " << l << endl;
return l;
}
long long mod = 1000000009;
long long modPow(long long a, long long n)
{
if(n == 0)
return 1;
else if (n % 2 == 0)
{
long long part = modPow(a, n / 2);
return (part * part) % mod;
}
else
{
return (a * modPow(a, n - 1)) % mod;
}
}
//----------------------
int countReplacement(int n, int inputSeq[])
{
if(valid(n, inputSeq) == 0)
return 0;
int diff = -5 * n;
for(int i = 0; i < n; i++)
{
if(inputSeq[i] <= n)
{
diff = inputSeq[i] - (i + 1);
break;
}
}
bool everyPos = false;
if(diff == -5 * n)
everyPos = true;
vector<int> sortedGoal;
for(int i = 0; i < n; i++)
{
if(inputSeq[i] > n)
sortedGoal.push_back(inputSeq[i]);
}
sort(sortedGoal.begin(), sortedGoal.end());
int cur = n + 1;
long long ans = 1;
for(int i = 0; i < sortedGoal.size(); i++)
{
// cout << "keliu: " << (int) sortedGoal.size() - i << " " << sortedGoal[i] - cur << endl;
ans *= modPow((int)sortedGoal.size() - i, sortedGoal[i] - cur);
ans %= mod;
cur = sortedGoal[i] + 1;
}
if(everyPos)
{
ans *= (long long) n;
ans %= mod;
}
return ans;
}