Submission #1193750

#TimeUsernameProblemLanguageResultExecution timeMemory
1193750DobromirAngelovScales (IOI15_scales)C++20
100 / 100
27 ms1352 KiB
#include "scales.h" #include<bits/stdc++.h> using namespace std; const int MAXV=1e4+5; const int maxP[7]={1,3,9,27,81,243,729}; struct Query { int a,b,c,d; Query() {}; Query(int _a,int _b,int _c,int _d) { a=_a; b=_b; c=_c; d=_d; } int query() { int res=0; 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 0; if(res==b) return 1; if(res==c) return 2; } int getAns(vector<int> cur) { int ia,ib,ic,id; for(int i=0;i<6;i++) { if(cur[i]==a) ia=i; if(cur[i]==b) ib=i; if(cur[i]==c) ic=i; if(cur[i]==d) id=i; } int mn=min(ia, min(ib, ic)); int mx=max(ia, max(ib, ic)); int m=ia+ib+ic-mn-mx; bool fl=1; if(d!=a && d!=b && d!=c) fl=0; if(d==a || (fl==0 && (id<mn || id>mx))) { if(ia==mn) return 0; if(ib==mn) return 1; if(ic==mn) return 2; } if(d==b || (fl==0 && (id>mn && id<m))) { if(ia==m) return 0; if(ib==m) return 1; if(ic==m) return 2; } if(d==c || (fl==0 && (id>m && id<mx))) { if(ia==mx) return 0; if(ib==mx) return 1; if(ic==mx) return 2; } //cout<<"aa"<<1/0<<endl; } }; vector<Query> queries; struct Node { int rem; vector<vector<int> > poss; Query qr; int children[3]; }; Node tree[MAXV]; bool build(int ind) { if(tree[ind].poss.size()<=1) { //cout<<ind<<";"; return 1; } // if(tree[ind].rem<0) return 0; tree[ind].children[0]=3*ind+1; tree[ind].children[1]=3*ind+2; tree[ind].children[2]=3*ind+3; int cnt[3]; for(Query &qr: queries) { cnt[0]=cnt[1]=cnt[2]=0; for(auto &cur: tree[ind].poss) { int x=qr.getAns(cur); cnt[x]++; if(cnt[x]>maxP[tree[ind].rem]) break; } if(max(cnt[0], max(cnt[1], cnt[2]))>maxP[tree[ind].rem]) continue; for(int i=0;i<3;i++) { tree[tree[ind].children[i]].poss.clear(); tree[tree[ind].children[i]].rem=tree[ind].rem-1; } for(auto &cur: tree[ind].poss) { tree[tree[ind].children[qr.getAns(cur)]].poss.push_back(cur); } bool fl=1; for(int i=0;i<3;i++) fl&=build(tree[ind].children[i]); if(!fl) continue; else { tree[ind].qr=qr; //cout<<ind<<" "<<tree[ind].poss.size()<<" , "; return 1; } } return 0; } void init(int T) { for(int i=1;i<=4;i++) for(int j=i+1;j<=5;j++) for(int k=j+1;k<=6;k++) for(int h=1;h<=6;h++) queries.push_back(Query(i,j,k,h)); tree[0].rem=5; vector<int> v={1,2,3,4,5,6}; do { tree[0].poss.push_back(v); } while (next_permutation(v.begin(), v.end())); build(0);//cout<<endl; } int a[6]; void orderCoins() { int ind=0;//cout<<1; while(tree[ind].poss.size()>1) { if(tree[ind].qr.a==0) cout<<ind<<" a0"<<endl; if(tree[ind].qr.b==0) cout<<ind<<" b0"<<endl; if(tree[ind].qr.c==0) cout<<ind<<" c0"<<endl; if(tree[ind].qr.d==0) cout<<ind<<" d0"<<endl; ind=tree[ind].children[tree[ind].qr.query()]; }//cout<<2; for(int i=0;i<6;i++) a[i]=tree[ind].poss[0][i]; answer(a); }

Compilation message (stderr)

scales.cpp: In member function 'int Query::getAns(std::vector<int>)':
scales.cpp:65:5: warning: control reaches end of non-void function [-Wreturn-type]
   65 |     }
      |     ^
scales.cpp: In member function 'int Query::query()':
scales.cpp:29:5: warning: control reaches end of non-void function [-Wreturn-type]
   29 |     }
      |     ^
#Verdict Execution timeMemoryGrader output
Fetching results...