# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
386753 | alishahali1382 | 저울 (IOI15_scales) | C++14 | 28 ms | 748 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "scales.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O2")
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
#define debug(x) {cerr<<#x<<"="<<x<<"\n";}
#define debug2(x, y) {cerr<<#x<<", "<<#y<<"="<<x<<", "<<y<<"\n";}
#define debugp(p) {cerr<<#p<<"={"<<p.first<<", "<<p.second<<"}\n";}
#define all(x) x.begin(), x.end()
#define pb push_back
int n, m;
vi perms[720];
vi opers[120];
int tmp[7], out[6];
bool mark[720];
int prep[720][120];
int Ask(vi &oper){
if (oper[0]==1) return getLightest(oper[1], oper[2], oper[3]);
if (oper[0]==2) return getMedian(oper[1], oper[2], oper[3]);
if (oper[0]==3) return getHeaviest(oper[1], oper[2], oper[3]);
return getNextLightest(oper[1], oper[2], oper[3], oper[4]);
}
int _Ask(vi &perm, vi oper){
for (int i=0; i<6; i++) tmp[perm[i]]=i;
sort(oper.begin()+1, oper.begin()+4, [](int i, int j){
return tmp[i]<tmp[j];
});
if (oper[0]<=3) return oper[oper[0]];
int a=oper[1], b=oper[2], c=oper[3], d=oper[4];
if (tmp[d]<tmp[a]) return a;
if (tmp[d]<tmp[b]) return b;
if (tmp[d]<tmp[c]) return c;
return a;
}
void init(int T){
T=T; // dont warn :)
vi shit={1, 2, 3, 4, 5, 6};
do{
perms[n++]=shit;
} while(next_permutation(all(shit)));
for (int a=1; a<=6; a++) for (int b=a+1; b<=6; b++) for (int c=b+1; c<=6; c++){
opers[m++]={1, a, b, c};
opers[m++]={2, a, b, c};
opers[m++]={3, a, b, c};
for (int d=1; d<=6; d++) if (d!=a && d!=b && d!=c) opers[m++]={4, a, b, c, d};
}
assert(n==720 && m==120);
for (int i=0; i<n; i++) for (int j=0; j<m; j++)
prep[i][j]=_Ask(perms[i], opers[j]);
}
void orderCoins(){
memset(mark, 1, sizeof(mark));
while (1){
int bst=100000, opid=-1;
for (int i=0; i<m; i++){
int a=opers[i][1], b=opers[i][2], c=opers[i][3];
int ta=0, tb=0, tc=0;
for (int j=0; j<n; j++) if (mark[j]){
ta+=(prep[j][i]==a);
tb+=(prep[j][i]==b);
tc+=(prep[j][i]==c);
}
int val=max({ta, tb, tc});
if (val<=bst || opid==-1){
bst=val;
opid=i;
}
}
assert(opid!=-1);
int res=Ask(opers[opid]), ted=0;
for (int i=0; i<n; i++) if (mark[i]){
if (prep[i][opid]==res) ted++;
else mark[i]=0;
}
// debug2(bst, ted)
if (ted==1) break ;
}
for (int i=0; i<n; i++) if (mark[i]){
for (int j=0; j<6; j++) out[j]=perms[i][j];
}
answer(out);
// debug("done")
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |