# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
60809 | Eae02 | 저울 (IOI15_scales) | C++14 | 6 ms | 696 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "scales.h"
#include <bits/stdc++.h>
std::set<uint32_t> possibleInitial;
uint32_t getIndex(int* N)
{
uint32_t m = 0;
for (int i = 0; i < 6; i++)
{
m |= N[i] << (i * 3);
}
return m;
}
void init(int T)
{
int N[6] = { 1, 2, 3, 4, 5, 6 };
do
{
possibleInitial.insert(getIndex(N));
} while (std::next_permutation(N, N + 6));
}
struct Condition
{
int l;
int g;
Condition() = default;
Condition(int _l, int _g) : l(_l), g(_g) { }
inline bool operator<(const Condition& other) const
{
return l == other.l ? g < other.g : l < other.l;
}
inline bool operator==(const Condition& other) const
{
return l == other.l && g == other.g;
}
};
bool works(uint32_t x, const Condition* c, int num)
{
int indexOf[7];
for (int i = 0; i < 6; i++)
{
indexOf[x & 7] = i;
x >>= 3;
}
for (int i = 0; i < num; i++)
{
if (!(indexOf[c[i].l] < indexOf[c[i].g]))
return false;
}
return true;
}
#define all(x) x.begin(),x.end()
std::bitset<2 << 9> done[2];
void orderCoins()
{
done[0].reset();
done[1].reset();
std::set<uint32_t> possible = possibleInitial;
int N[6] = { 1, 2, 3, 4, 5, 6 };
while (possible.size() > 1)
{
std::random_shuffle(N, N + 6);
int type = rand() % 2;
uint32_t qIndex = N[0] | (N[1] << 3) | (N[2] << 6);
if (done[type][qIndex])
continue;
done[type][qIndex] = true;
int v;
if (type)
{
bool good = true;
for (int i = 0; i < 3; i++)
{
Condition extra[2] = { { N[(i + 1) % 3], N[i] }, { N[(i + 2) % 3], N[i] } };
if (!std::any_of(all(possible), [&] (uint32_t p) { return !works(p, extra, 2); }))
{
good = false;
break;
}
}
if (!good)
continue;
v = getHeaviest(N[0], N[1], N[2]);
}
else
{
bool good = true;
for (int i = 0; i < 3; i++)
{
Condition extra[2] = { { N[i], N[(i + 1) % 3] }, { N[i], N[(i + 2) % 3] } };
if (!std::any_of(all(possible), [&] (uint32_t p) { return !works(p, extra, 2); }))
{
good = false;
break;
}
}
if (!good)
continue;
v = getLightest(N[0], N[1], N[2]);
}
int o1, o2;
if (v == N[0])
{
o1 = N[1];
o2 = N[2];
}
else if (v == N[1])
{
o1 = N[0];
o2 = N[2];
}
else if (v == N[2])
{
o1 = N[0];
o2 = N[1];
}
Condition cond[2];
if (type)
{
cond[0] = { o1, v };
cond[1] = { o2, v };
}
else
{
cond[0] = { v, o1 };
cond[1] = { v, o2 };
}
for (auto it = possible.begin(); it != possible.end(); ++it)
{
if (!works(*it, cond, 2))
possible.erase(it);
}
//std::cout << possible.size() << std::endl;
}
uint32_t val = *possible.begin();
int resp[6];
for (int i = 0; i < 6; i++)
{
resp[i] = val & 7;
val >>= 3;
}
answer(resp);
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |