제출 #940763

#제출 시각아이디문제언어결과실행 시간메모리
940763AdamGS저울 (IOI15_scales)C++17
71.43 / 100
381 ms1152 KiB
#include "scales.h" #include<bits/stdc++.h> using namespace std; #define rep(a, b) for(int a = 0; a < (b); ++a) #define st first #define nd second #define pb push_back #define all(a) a.begin(), a.end() const int INF=1e9+7; struct node { int typ=-1, A, B, C, D; int nxta, nxtb, nxtc; vector<int>P; }; node puste; vector<node>V; void solve(vector<vector<int>>&T, int ind); int get_hev(vector<int>&T, int A, int B, int C) { vector<pair<int,int>>P; P.pb({T[A], A}); P.pb({T[B], B}); P.pb({T[C], C}); sort(all(P)); return P[2].nd; } int get_lig(vector<int>&T, int A, int B, int C) { vector<pair<int,int>>P; P.pb({T[A], A}); P.pb({T[B], B}); P.pb({T[C], C}); sort(all(P)); return P[0].nd; } int get_med(vector<int>&T, int A, int B, int C) { vector<pair<int,int>>P; P.pb({T[A], A}); P.pb({T[B], B}); P.pb({T[C], C}); sort(all(P)); return P[1].nd; } int get_nxt(vector<int>&T, int A, int B, int C, int D) { vector<pair<int,int>>P; P.pb({T[A], A}); P.pb({T[B], B}); P.pb({T[C], C}); sort(all(P)); for(auto i : P) if(i.st>T[D]) return i.nd; return P[0].nd; } void rob(vector<vector<int>>&T, int ind, int typ, int A, int B, int C, int D) { vector<vector<int>>X, Y, Z; for(auto i : T) { int p; if(typ==0) p=get_hev(i, A, B, C); if(typ==1) p=get_lig(i, A, B, C); if(typ==2) p=get_med(i, A, B, C); if(typ==3) p=get_nxt(i, A, B, C, D); if(p==A) X.pb(i); if(p==B) Y.pb(i); if(p==C) Z.pb(i); } V[ind].typ=typ; V[ind].A=A; V[ind].B=B; V[ind].C=C; V[ind].D=D; if(X.size()) { V[ind].nxta=V.size(); V.pb(puste); solve(X, V[ind].nxta); } if(Y.size()) { V[ind].nxtb=V.size(); V.pb(puste); solve(Y, V[ind].nxtb); } if(Z.size()) { V[ind].nxtc=V.size(); V.pb(puste); solve(Z, V[ind].nxtc); } } void solve(vector<vector<int>>&T, int ind) { if(T.size()==1) V[ind].P=T[0]; if(T.size()<=1) return; int mi=INF; rep(A, 6) rep(B, 6) rep(C, 6) if(A!=B && A!=C && B!=C) { int x=0, y=0, z=0; for(auto i : T) { int p=get_hev(i, A, B, C); if(p==A) ++x; if(p==B) ++y; if(p==C) ++z; } mi=min(mi, max(max(x, y), z)); x=y=z=0; for(auto i : T) { int p=get_lig(i, A, B, C); if(p==A) ++x; if(p==B) ++y; if(p==C) ++z; } mi=min(mi, max(max(x, y), z)); x=y=z=0; for(auto i : T) { int p=get_med(i, A, B, C); if(p==A) ++x; if(p==B) ++y; if(p==C) ++z; } mi=min(mi, max(max(x, y), z)); rep(D, 6) if(A!=D && B!=D && C!=D) { x=y=z=0; for(auto i : T) { int p=get_nxt(i, A, B, C, D); if(p==A) ++x; if(p==B) ++y; if(p==C) ++z; } mi=min(mi, max(max(x, y), z)); } } rep(A, 6) rep(B, 6) rep(C, 6) if(A!=B && A!=C && B!=C) { int x=0, y=0, z=0; for(auto i : T) { int p=get_hev(i, A, B, C); if(p==A) ++x; if(p==B) ++y; if(p==C) ++z; } if(max(max(x, y), z)==mi) { rob(T, ind, 0, A, B, C, 0); return; } x=y=z=0; for(auto i : T) { int p=get_lig(i, A, B, C); if(p==A) ++x; if(p==B) ++y; if(p==C) ++z; } if(max(max(x, y), z)==mi) { rob(T, ind, 1, A, B, C, 0); return; } x=y=z=0; for(auto i : T) { int p=get_med(i, A, B, C); if(p==A) ++x; if(p==B) ++y; if(p==C) ++z; } if(max(max(x, y), z)==mi) { rob(T, ind, 2, A, B, C, 0); return; } rep(D, 6) if(A!=D && B!=D && C!=D) { x=y=z=0; for(auto i : T) { int p=get_nxt(i, A, B, C, D); if(p==A) ++x; if(p==B) ++y; if(p==C) ++z; } if(max(max(x, y), z)==mi) { rob(T, ind, 3, A, B, C, D); return; } } } } void init(int T) { V.pb(puste); vector<vector<int>>P; vector<int>X; rep(i, 6) X.pb(i); do P.pb(X); while(next_permutation(all(X))); solve(P, 0); } void zejdz(int x) { if(V[x].P.size()==6) { int ans[6]; rep(i, 6) ans[V[x].P[i]]=i+1; answer(ans); return; } int p; if(V[x].typ==0) p=getHeaviest(V[x].A+1, V[x].B+1, V[x].C+1); if(V[x].typ==1) p=getLightest(V[x].A+1, V[x].B+1, V[x].C+1); if(V[x].typ==2) p=getMedian(V[x].A+1, V[x].B+1, V[x].C+1); if(V[x].typ==3) p=getNextLightest(V[x].A+1, V[x].B+1, V[x].C+1, V[x].D+1); if(p==V[x].A+1) zejdz(V[x].nxta); if(p==V[x].B+1) zejdz(V[x].nxtb); if(p==V[x].C+1) zejdz(V[x].nxtc); } void orderCoins() { zejdz(0); }

컴파일 시 표준 에러 (stderr) 메시지

scales.cpp: In function 'void rob(std::vector<std::vector<int> >&, int, int, int, int, int, int)':
scales.cpp:69:23: warning: conversion from 'std::vector<node>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   69 |     V[ind].nxta=V.size();
      |                 ~~~~~~^~
scales.cpp:74:23: warning: conversion from 'std::vector<node>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   74 |     V[ind].nxtb=V.size();
      |                 ~~~~~~^~
scales.cpp:79:23: warning: conversion from 'std::vector<node>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   79 |     V[ind].nxtc=V.size();
      |                 ~~~~~~^~
scales.cpp: In function 'void init(int)':
scales.cpp:173:15: warning: unused parameter 'T' [-Wunused-parameter]
  173 | void init(int T) {
      |           ~~~~^
scales.cpp: In function 'void zejdz(int)':
scales.cpp:193:3: warning: 'p' may be used uninitialized in this function [-Wmaybe-uninitialized]
  193 |   if(p==V[x].A+1) zejdz(V[x].nxta);
      |   ^~
scales.cpp: In function 'void rob(std::vector<std::vector<int> >&, int, int, int, int, int, int)':
scales.cpp:61:5: warning: 'p' may be used uninitialized in this function [-Wmaybe-uninitialized]
   61 |     if(p==C) Z.pb(i);
      |     ^~
#Verdict Execution timeMemoryGrader output
Fetching results...