# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
984617 | jay_jayjay | 저울 (IOI15_scales) | C++14 | 14 ms | 604 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
// {{{1
extern "C" int __lsan_is_turned_off() { return 1; }
#include <bits/stdc++.h>
using namespace std;
#include <tr2/dynamic_bitset>
using namespace tr2;
#include <ext/pb_ds/assoc_container.hpp>
#define ll long long
#define inf 0x3f3f3f3f
#define infl 0x3f3f3f3f3f3f3f3fll
#include <assert.h>
#ifdef DEBUG
#define dprintf(args...) fprintf(stderr,args)
#endif
#ifndef DEBUG
#define dprintf(args...) 69
#endif
#define all(x) (x).begin(), (x).end()
struct cintype { template<typename T> operator T() { T x; cin>>x; return x; } };
// 1}}}
#include "scales.h"
struct query {
char t, a, b, c, d;
query(){}
query(int t, int a, int b, int c, int d) : t(t),a(a),b(b),c(c),d(d) {}
int ex() {
int C=0;
switch(t) {
case 1: C=getHeaviest(a+1,b+1,c+1); break;
case 2: C=getLightest(a+1,b+1,c+1); break;
case 3: C=getMedian(a+1,b+1,c+1); break;
case 4: C=getNextLightest(a+1,b+1,c+1,d+1); break;
}
C--;
//printf("ex %d | %d %d %d | %d : %d\n",t,a,b,c,d,C);
return C==a?0:C==b?1:C==c?2:-1;
}
int sim(array<char,6> p) {
array<array<char,2>,3> q{ array<char,2>{p[a],a},array<char,2>{p[b],b},array<char,2>{p[c],c} };
sort(all(q));
auto [x,y,z] = q;
int C=0;
switch(t) {
case 1: C=z[1]; break;
case 2: C=x[1]; break;
case 3: C=y[1]; break;
case 4: C=p[d]<x[0]?x[1]:p[d]<y[0]?y[1]:p[d]<z[0]?z[1]:x[1]; break;
}
return C==a?0:C==b?1:C==c?2:-1;
}
bool operator < (const query& o) const { return make_tuple(t,a,b,c,d)<make_tuple(o.t,o.a,o.b,o.c,o.d); }
};
query Q[5000];
int work(int p, int T, vector<array<char,6>> z) {
if(z.size()<=1)return 0;
if(T==6)return 1;
//printf("%d %d %d\n",p,T,z.size());
//if(z.size()<10) for(auto v:z){for(auto x:v)printf("%d",x);printf("\n");}
if(T==0) {
for(auto q : {query{1,1,2,3,4},query{2,1,2,3,4},query{3,1,2,3,4},query{4,1,2,3,4}}) {
array<vector<array<char,6>>,3> np;
for(auto&x:z) np[q.sim(x)].push_back(x);
int mx = max({np[0].size(),np[1].size(),np[2].size()});
if(mx>240)continue;
if(work(3*p+1,T+1, np[0])) continue;
if(work(3*p+2,T+1, np[1])) continue;
if(work(3*p+3,T+1, np[2])) continue;
Q[p]=q;
return 0;
}
return 1;
}
for(int t=1;t<5;t++) {
for(int d=0;d<(t==4?6:1);d++) {
for(int a=0;a<6;a++)
for(int b=a+1;b<6;b++)
for(int c=b+1;c<6;c++) {
if(t==4 && (a==d||b==d||c==d)) continue;
query q{t,a,b,c,d};
array<vector<array<char,6>>,3> np;
for(auto&x:z) np[q.sim(x)].push_back(x);
int mx = max({np[0].size(),np[1].size(),np[2].size()});
if(T==1&&mx>80)continue;
if(T==2&&mx>27)continue;
if(T==3&&mx>9)continue;
if(T==4&&mx>3)continue;
if(T==5&&mx>1)continue;
if(work(3*p+1,T+1, np[0])) continue;
if(work(3*p+2,T+1, np[1])) continue;
if(work(3*p+3,T+1, np[2])) continue;
Q[p]=q;
return 0;
}
}
}
return 1;
}
void init(int T) {
if(query(1,1,2,3,4).sim({1,2,3,4,5,6}) != 2)assert(0);
if(query(2,1,2,3,4).sim({1,2,3,4,5,6}) != 0)assert(0);
if(query(3,1,2,3,4).sim({1,2,3,4,5,6}) != 1)assert(0);
if(query(3,1,3,4,2).sim({1,2,3,4,5,6}) != 1)assert(0);
vector<array<char,6>> v;
array<char,6> a{1,2,3,4,5,6};
do { v.push_back(a); } while(next_permutation(all(a)));
int st = work(0, 0, v);
//printf("%d\n",st);
}
void orderCoins() {
vector<array<char,6>> v;
array<char,6> a{1,2,3,4,5,6};
do { v.push_back(a); } while(next_permutation(all(a)));
int i=0;
while(v.size()>1) {
//printf("%d %d\n",i, v.size());
query q = Q[i];
int s;
i = i*3 + (s=q.ex())+1;
decltype(v) nv;
for(auto p:v)if(q.sim(p)==s)nv.push_back(p);
v=nv;
}
//printf("%d %d\n",i, v.size());
auto p=v[0];
int W[6];
for(int i=0;i<6;i++)W[+p[i]-1] = i+1;
answer(W);
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |