# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
115418 | nvmdava | 저울 (IOI15_scales) | C++17 | 14 ms | 768 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "scales.h"
#include <bits/stdc++.h>
using namespace std;
int depmax[] = {729, 243, 81, 27, 9, 3, 1};
struct Ord{
int a[7];
Ord(vector<int>& v){
for(int i = 0; i < 6; i++)
a[i + 1] = v[i];
}
};
struct Query{
int a, b, c, d;
Query(int _a, int _b, int _c, int _d){
a = _a;
b = _b;
c = _c;
d = _d;
}
int ask(){
int res;
if(d == a) res = getLightest(a, b, c);
else if(d == b) res = getMedian(a, b, c);
else if(d == c) res = getHeaviest(a, b, c);
else res = getNextLightest(a, b, c, d);
if(res == a) return 1;
if(res == b) return 2;
if(res == c) return 3;
}
int simask(Ord& ord){
int i = a, j = b, l = c, res;
if(ord.a[i] > ord.a[j]) swap(i, j);
if(ord.a[j] > ord.a[l]) swap(j, l);
if(ord.a[i] > ord.a[j]) swap(i, j);
if(a == d) res = i;
else if(b == d) res = j;
else if(c == d) res = l;
else if(ord.a[d] < ord.a[i]) res = i;
else if(ord.a[d] < ord.a[j]) res = j;
else if(ord.a[d] < ord.a[l]) res = l;
else res = i;
if(res == a) return 1;
if(res == b) return 2;
if(res == c) return 3;
}
};
vector<Query> lists;
struct Node{
int dep;
Query* q;
vector<Ord*> pos;
Node* go[4];
bool init(){
if(pos.size() <= 1) return 1;
int cnt[4] = {0};
bool ok = 0;
for(auto& qq : lists){
cnt[1] = 0;
cnt[2] = 0;
cnt[3] = 0;
for(auto& ord : pos){
int res = qq.simask(*ord);
cnt[res]++;
if(cnt[res] > depmax[dep]) break;
}
if(cnt[1] > depmax[dep]) continue;
if(cnt[2] > depmax[dep]) continue;
if(cnt[3] > depmax[dep]) continue;
q = &qq;
for(int i = 1; i <= 3; i++){
go[i] = new Node();
go[i] -> dep = dep + 1;
}
for(auto ord : pos){
go[qq.simask(*ord)] -> pos.push_back(ord);
}
if(!go[1] -> init()){
delete go[1];
continue;
}
if(!go[2] -> init()){
delete go[2];
continue;
}
if(!go[3] -> init()){
delete go[3];
continue;
}
ok = 1;
break;
}
return ok;
}
} *root;
void create(){
for(int i = 1; i < 5; i++){
for(int j = i + 1; j < 6; j++){
for(int l = j + 1; l <= 6; l++){
for(int k = 1; k <= 6; k++){
lists.push_back(Query(i, j, l, k));
}
}
}
}
}
void init(int T) {
create();
root = new Node();
vector<int> v = {1, 2, 3, 4, 5, 6};
do{
root -> pos.push_back(new Ord(v));
} while(next_permutation(v.begin(), v.end()));
root -> dep = 1;
root -> init();
}
void orderCoins() {
/* ... */
int W[] = {1, 2, 3, 4, 5, 6};
Node* ans = root;
while(ans -> pos.size() != 1)
ans = ans -> go[ans -> q -> ask()];
for(int i = 1; i <= 6; i++){
W[ans -> pos[0] -> a[i] - 1] = i;
}
answer(W);
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |