Submission #72994

# Submission time Handle Problem Language Result Execution time Memory
72994 2018-08-27T12:25:27 Z edisonhello Scales (IOI15_scales) C++14
100 / 100
893 ms 892 KB
#include<bits/stdc++.h>
using namespace std;

#ifndef WEAK
#include"scales.h"
#else

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wreturn-type"
int coins[6],pos[6],qtime;
int Init(){ return 1; }
void orderCoins(){
    cout<<"orderCoins: "<<endl;
    for(int i=0;i<6;++i)cin>>coins[i],pos[coins[i]]=i;
}
void answer(int *a){
    cout<<"answer: ";
    for(int i=0;i<6;++i)cout<<a[i]<<" "; cout<<endl;
    cout<<"Query "<<qtime<<" times"<<endl;
}
int getHeaviest(int i,int j,int k){
    ++qtime;
    cout<<"getHeaviest "<<i<<" "<<j<<" "<<k<<endl;
    if(pos[i]>pos[j] && pos[i]>pos[k])return i;
    if(pos[j]>pos[i] && pos[j]>pos[k])return j;
    if(pos[k]>pos[i] && pos[k]>pos[j])return k;
}
int getLightest(int i,int j,int k){
    ++qtime;
    cout<<"getLightest "<<i<<" "<<j<<" "<<k<<endl;
    if(pos[i]<pos[j] && pos[i]<pos[k])return i;
    if(pos[j]<pos[i] && pos[j]<pos[k])return j;
    if(pos[k]<pos[i] && pos[k]<pos[j])return k;
}
int getMedian(int i,int j,int k){
    ++qtime;
    cout<<"getMedian "<<i<<" "<<j<<" "<<k<<endl;
    if((pos[i]>pos[j])^(pos[i]>pos[k]))return i;
    if((pos[j]>pos[i])^(pos[j]>pos[k]))return j;
    if((pos[k]>pos[i])^(pos[k]>pos[j]))return k;
}
int getNextLightest(int i,int j,int k,int l){
    ++qtime;
    cout<<"getNextLightest "<<i<<" "<<j<<" "<<k<<" "<<l<<endl;
    pair<int,int> pp[4]={{pos[i],i},{pos[j],j},{pos[k],k},{pos[l],l}};
    sort(pp,pp+4);
    if(pp[3].second==l)return pp[0].second;
    for(int i=0;i<3;++i)if(pp[i].second==l)return pp[i+1].second;
}
#pragma GCC diagnostic pop
#endif

struct operation{
    int type,arg1,arg2,arg3,arg4;
};
vector<operation> ops;

int go(vector<vector<int>> &now,bool okQ=0){
    if(now.size()<=1u)return 1;
    auto pnow=[&](){
        cout<<"now: "<<endl;
        for(auto &v:now){
            for(int i:v)cout<<i<<" ";
            cout<<endl;
        }
    };
    // pnow();
    // cout<<"okQ: "<<okQ<<endl;
    int pos[8];
    
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wreturn-type"
    auto _sim_getHeaviest=[&](const int i,const int j,const int k){
        if(pos[i]>pos[j] && pos[i]>pos[k])return i;
        if(pos[j]>pos[i] && pos[j]>pos[k])return j;
        if(pos[k]>pos[i] && pos[k]>pos[j])return k;
    };
    auto _sim_getLightest=[&](const int i,const int j,const int k){
        if(pos[i]<pos[j] && pos[i]<pos[k])return i;
        if(pos[j]<pos[i] && pos[j]<pos[k])return j;
        if(pos[k]<pos[i] && pos[k]<pos[j])return k;
    };
    auto _sim_getMedian=[&](const int i,const int j,const int k){
        if((pos[i]>pos[j])^(pos[i]>pos[k]))return i;
        if((pos[j]>pos[i])^(pos[j]>pos[k]))return j;
        if((pos[k]>pos[i])^(pos[k]>pos[j]))return k;
    };
    auto _sim_getNextLightest=[&](const int i,const int j,const int k,const int l){
        pair<int,int> pp[4]={{pos[i],i},{pos[j],j},{pos[k],k},{pos[l],l}};
        sort(pp,pp+4);
        if(pp[3].second==l)return pp[0].second;
        for(int i=0;i<3;++i)if(pp[i].second==l)return pp[i+1].second;
    };
#pragma GCC diagnostic pop

    for(int i=1;i<=4;++i){
        for(int j=i+1;j<=5;++j){
            for(int k=j+1;k<=6;++k){
                int r1=0,r2=0,r3=0,lim=(now.size()+2)/3;
                for(auto &v:now){
                    for(int i=0;i<6;++i)pos[v[i]]=i;
                    int r=_sim_getHeaviest(i,j,k);
                    if(r==i)++r1;
                    if(r==j)++r2;
                    if(r==k)++r3;
                }
                // cout<<"rrrl: "<<r1<<" "<<r2<<" "<<r3<<" "<<lim<<endl;
                if(r1<=lim && r2<=lim && r3<=lim){
                    vector<vector<int>> v1,v2,v3;
                    for(auto &v:now){
                        for(int i=0;i<6;++i)pos[v[i]]=i;
                        int r=_sim_getHeaviest(i,j,k);
                        if(r==i)v1.push_back(v);
                        if(r==j)v2.push_back(v);
                        if(r==k)v3.push_back(v);
                    }
                    int ok=go(v1)+go(v2)+go(v3);
                    if(ok>=3){
                        if(!okQ)return 1;
                        vector<vector<int>> tmp;
                        int r=getHeaviest(i,j,k);
                        for(auto &v:now){
                            for(int i=0;i<6;++i)pos[v[i]]=i;
                            if(_sim_getHeaviest(i,j,k)==r)tmp.push_back(v);
                        }
                        now.swap(tmp);
                        assert(go(now,1)==1);
                        return 1;
                    }
                }

                r1=r2=r3=0;
                for(auto &v:now){
                    for(int i=0;i<6;++i)pos[v[i]]=i;
                    int r=_sim_getLightest(i,j,k);
                    if(r==i)++r1;
                    if(r==j)++r2;
                    if(r==k)++r3;
                }
                // cout<<"rrrl: "<<r1<<" "<<r2<<" "<<r3<<" "<<lim<<endl;
                if(r1<=lim && r2<=lim && r3<=lim){
                    vector<vector<int>> v1,v2,v3;
                    for(auto &v:now){
                        for(int i=0;i<6;++i)pos[v[i]]=i;
                        int r=_sim_getLightest(i,j,k);
                        if(r==i)v1.push_back(v);
                        if(r==j)v2.push_back(v);
                        if(r==k)v3.push_back(v);
                    }
                    int ok=go(v1)+go(v2)+go(v3);
                    if(ok>=3){
                        if(!okQ)return 1;
                        vector<vector<int>> tmp;
                        int r=getLightest(i,j,k);
                        for(auto &v:now){
                            for(int i=0;i<6;++i)pos[v[i]]=i;
                            if(_sim_getLightest(i,j,k)==r)tmp.push_back(v);
                        }
                        now.swap(tmp);
                        assert(go(now,1)==1);
                        return 1;
                    }
                }

                r1=r2=r3=0;
                for(auto &v:now){
                    for(int i=0;i<6;++i)pos[v[i]]=i;
                    int r=_sim_getMedian(i,j,k);
                    if(r==i)++r1;
                    if(r==j)++r2;
                    if(r==k)++r3;
                }
                // cout<<"rrrl: "<<r1<<" "<<r2<<" "<<r3<<" "<<lim<<endl;
                if(r1<=lim && r2<=lim && r3<=lim){
                    vector<vector<int>> v1,v2,v3;
                    for(auto &v:now){
                        for(int i=0;i<6;++i)pos[v[i]]=i;
                        int r=_sim_getMedian(i,j,k);
                        if(r==i)v1.push_back(v);
                        if(r==j)v2.push_back(v);
                        if(r==k)v3.push_back(v);
                    }
                    int ok=go(v1)+go(v2)+go(v3);
                    if(ok>=3){
                        if(!okQ)return 1;
                        vector<vector<int>> tmp;
                        int r=getMedian(i,j,k);
                        for(auto &v:now){
                            for(int i=0;i<6;++i)pos[v[i]]=i;
                            if(_sim_getMedian(i,j,k)==r)tmp.push_back(v);
                        }
                        now.swap(tmp);
                        assert(go(now,1)==1);
                        return 1;
                    }
                }

                for(int l=1;l<=6;++l){
                    if(l==i || l==j || l==k)continue;
                    r1=r2=r3=0;
                    for(auto &v:now){
                        for(int i=0;i<6;++i)pos[v[i]]=i;
                        int r=_sim_getNextLightest(i,j,k,l);
                        if(r==i)++r1;
                        if(r==j)++r2;
                        if(r==k)++r3;
                    }
                // cout<<"rrrl: "<<r1<<" "<<r2<<" "<<r3<<" "<<lim<<endl;
                    if(r1<=lim && r2<=lim && r3<=lim){
                        vector<vector<int>> v1,v2,v3;
                        for(auto &v:now){
                            for(int i=0;i<6;++i)pos[v[i]]=i;
                            int r=_sim_getNextLightest(i,j,k,l);
                            if(r==i)v1.push_back(v);
                            if(r==j)v2.push_back(v);
                            if(r==k)v3.push_back(v);
                        }
                        int ok=go(v1)+go(v2)+go(v3);
                        if(ok>=3){
                            if(!okQ)return 1;
                            vector<vector<int>> tmp;
                            int r=getNextLightest(i,j,k,l);
                            for(auto &v:now){
                                for(int i=0;i<6;++i)pos[v[i]]=i;
                                if(_sim_getNextLightest(i,j,k,l)==r)tmp.push_back(v);
                            }
                            now.swap(tmp);
                            assert(go(now,1)==1);
                            return 1;
                        }
                    }
                }
            }
        }
    }
    return 0;
}



#ifdef WEAK
int main(){
    int t=Init(); while(t--){
        orderCoins();
        int a[6]={1,2,3,4,5,6};
        vector<vector<int>> now;
        vector<int> tmp(a,a+6);
        do{
            now.push_back(tmp);
        }while(next_permutation(tmp.begin(),tmp.end()));
        go(now,1);
        for(int i=0;i<6;++i)a[i]=now[0][i];
        answer(a);
    }
}
#else
void init(int T){}
void orderCoins(){
    int a[6]={1,2,3,4,5,6};
    vector<vector<int>> now;
    vector<int> tmp(a,a+6);
    do{
        now.push_back(tmp);
    }while(next_permutation(tmp.begin(),tmp.end()));
    go(now,1);
    for(int i=0;i<6;++i)a[i]=now[0][i];
    answer(a);
}
#endif

Compilation message

In file included from grader.c:2:0:
graderlib.c: In function 'void answer(int*)':
graderlib.c:53:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
     if (_ghksjhdfkae19ga_ > 1) 
     ^~
graderlib.c:56:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
  for (i = 0; i < 6; i++) {
  ^~~
scales.cpp: In lambda function:
scales.cpp:92:17: warning: declaration of 'int i' shadows a parameter [-Wshadow]
         for(int i=0;i<3;++i)if(pp[i].second==l)return pp[i+1].second;
                 ^
scales.cpp:88:45: note: shadowed declaration is here
     auto _sim_getNextLightest=[&](const int i,const int j,const int k,const int l){
                                             ^
scales.cpp: In function 'int go(std::vector<std::vector<int> >&, bool)':
scales.cpp:99:54: warning: conversion to 'int' from 'std::vector<std::vector<int> >::size_type {aka long unsigned int}' may alter its value [-Wconversion]
                 int r1=0,r2=0,r3=0,lim=(now.size()+2)/3;
                                        ~~~~~~~~~~~~~~^~
scales.cpp:101:29: warning: declaration of 'i' shadows a previous local [-Wshadow]
                     for(int i=0;i<6;++i)pos[v[i]]=i;
                             ^
scales.cpp:96:13: note: shadowed declaration is here
     for(int i=1;i<=4;++i){
             ^
scales.cpp:111:33: warning: declaration of 'i' shadows a previous local [-Wshadow]
                         for(int i=0;i<6;++i)pos[v[i]]=i;
                                 ^
scales.cpp:96:13: note: shadowed declaration is here
     for(int i=1;i<=4;++i){
             ^
scales.cpp:123:37: warning: declaration of 'i' shadows a previous local [-Wshadow]
                             for(int i=0;i<6;++i)pos[v[i]]=i;
                                     ^
scales.cpp:96:13: note: shadowed declaration is here
     for(int i=1;i<=4;++i){
             ^
scales.cpp:134:29: warning: declaration of 'i' shadows a previous local [-Wshadow]
                     for(int i=0;i<6;++i)pos[v[i]]=i;
                             ^
scales.cpp:96:13: note: shadowed declaration is here
     for(int i=1;i<=4;++i){
             ^
scales.cpp:144:33: warning: declaration of 'i' shadows a previous local [-Wshadow]
                         for(int i=0;i<6;++i)pos[v[i]]=i;
                                 ^
scales.cpp:96:13: note: shadowed declaration is here
     for(int i=1;i<=4;++i){
             ^
scales.cpp:156:37: warning: declaration of 'i' shadows a previous local [-Wshadow]
                             for(int i=0;i<6;++i)pos[v[i]]=i;
                                     ^
scales.cpp:96:13: note: shadowed declaration is here
     for(int i=1;i<=4;++i){
             ^
scales.cpp:167:29: warning: declaration of 'i' shadows a previous local [-Wshadow]
                     for(int i=0;i<6;++i)pos[v[i]]=i;
                             ^
scales.cpp:96:13: note: shadowed declaration is here
     for(int i=1;i<=4;++i){
             ^
scales.cpp:177:33: warning: declaration of 'i' shadows a previous local [-Wshadow]
                         for(int i=0;i<6;++i)pos[v[i]]=i;
                                 ^
scales.cpp:96:13: note: shadowed declaration is here
     for(int i=1;i<=4;++i){
             ^
scales.cpp:189:37: warning: declaration of 'i' shadows a previous local [-Wshadow]
                             for(int i=0;i<6;++i)pos[v[i]]=i;
                                     ^
scales.cpp:96:13: note: shadowed declaration is here
     for(int i=1;i<=4;++i){
             ^
scales.cpp:202:33: warning: declaration of 'i' shadows a previous local [-Wshadow]
                         for(int i=0;i<6;++i)pos[v[i]]=i;
                                 ^
scales.cpp:96:13: note: shadowed declaration is here
     for(int i=1;i<=4;++i){
             ^
scales.cpp:212:37: warning: declaration of 'i' shadows a previous local [-Wshadow]
                             for(int i=0;i<6;++i)pos[v[i]]=i;
                                     ^
scales.cpp:96:13: note: shadowed declaration is here
     for(int i=1;i<=4;++i){
             ^
scales.cpp:224:41: warning: declaration of 'i' shadows a previous local [-Wshadow]
                                 for(int i=0;i<6;++i)pos[v[i]]=i;
                                         ^
scales.cpp:96:13: note: shadowed declaration is here
     for(int i=1;i<=4;++i){
             ^
scales.cpp:60:10: warning: variable 'pnow' set but not used [-Wunused-but-set-variable]
     auto pnow=[&](){
          ^~~~
scales.cpp: In function 'void init(int)':
scales.cpp:257:15: warning: unused parameter 'T' [-Wunused-parameter]
 void init(int T){}
               ^
# Verdict Execution time Memory Grader output
1 Correct 695 ms 632 KB Output is correct
2 Correct 779 ms 640 KB Output is correct
3 Correct 722 ms 652 KB Output is correct
4 Correct 718 ms 696 KB Output is correct
5 Correct 775 ms 764 KB Output is correct
6 Correct 781 ms 776 KB Output is correct
7 Correct 772 ms 836 KB Output is correct
8 Correct 768 ms 836 KB Output is correct
9 Correct 737 ms 836 KB Output is correct
10 Correct 764 ms 836 KB Output is correct
11 Correct 839 ms 836 KB Output is correct
12 Correct 885 ms 836 KB Output is correct
13 Correct 893 ms 836 KB Output is correct
14 Correct 830 ms 836 KB Output is correct
15 Correct 842 ms 864 KB Output is correct
16 Correct 814 ms 864 KB Output is correct
17 Correct 800 ms 864 KB Output is correct
18 Correct 779 ms 864 KB Output is correct
19 Correct 827 ms 864 KB Output is correct
20 Correct 767 ms 864 KB Output is correct
21 Correct 835 ms 864 KB Output is correct
22 Correct 736 ms 864 KB Output is correct
23 Correct 843 ms 876 KB Output is correct
24 Correct 787 ms 876 KB Output is correct
25 Correct 737 ms 876 KB Output is correct
26 Correct 727 ms 876 KB Output is correct
27 Correct 760 ms 876 KB Output is correct
28 Correct 759 ms 876 KB Output is correct
29 Correct 718 ms 876 KB Output is correct
30 Correct 701 ms 876 KB Output is correct
31 Correct 704 ms 876 KB Output is correct
32 Correct 751 ms 876 KB Output is correct
33 Correct 813 ms 876 KB Output is correct
34 Correct 741 ms 876 KB Output is correct
35 Correct 753 ms 880 KB Output is correct
36 Correct 723 ms 880 KB Output is correct
37 Correct 761 ms 880 KB Output is correct
38 Correct 759 ms 880 KB Output is correct
39 Correct 771 ms 880 KB Output is correct
40 Correct 750 ms 892 KB Output is correct