Submission #639000

#TimeUsernameProblemLanguageResultExecution timeMemory
639000ggohScales (IOI15_scales)C++14
100 / 100
233 ms344 KiB
#include "scales.h"
#include<bits/stdc++.h>
using namespace std;
#define sz(v) ((int)(v).size())
typedef long long lint;
int ans,rev[720][7],sz;
int c[7],a[7];
void br(int p)
{
    if(p==7)
    {
        for(int i=1;i<=6;i++)
        {
            rev[sz][i]=a[i];
        }
        sz++;
        return ;
    }
    for(int i=1;i<=6;i++)
    {
        if(!c[i])
        {
            c[i]=1;
            a[p]=i;
            br(p+1);
            a[p]=0;
            c[i]=0;
        }
    }
}

void init(int T) {
    sz=0;
    br(1);
}

int f(vector<int> X)
{
    int n=sz(X);
    if(n<=1)
    {
        return 1;
    }
    int u=(n+2)/3;
    for(int i=1;i<=6;i++)
    {
        for(int j=i+1;j<=6;j++)
        {
            for(int k=j+1;k<=6;k++)
            {
                vector<int>Xi;
                vector<int>Xj;
                vector<int>Xk;
                
                //getHeaviest
                for(auto &x:X)
                {
                    if(rev[x][i]>rev[x][j] && rev[x][i]>rev[x][k])Xi.push_back(x);
                    if(rev[x][j]>rev[x][i] && rev[x][j]>rev[x][k])Xj.push_back(x);
                    if(rev[x][k]>rev[x][i] && rev[x][k]>rev[x][j])Xk.push_back(x);
                }

                if(sz(Xi)<=u && sz(Xj)<=u && sz(Xk)<=u)
                {
                    if(f(Xi) && f(Xj) && f(Xk))return 1;
                }
                //getMedian
                Xi.clear();
                Xj.clear();
                Xk.clear();
                for(auto &x:X)
                {
                    if((rev[x][i]>rev[x][j] && rev[x][i]<rev[x][k]) || (rev[x][i]<rev[x][j] && rev[x][i]>rev[x][k]))Xi.push_back(x);
                    if((rev[x][j]>rev[x][i] && rev[x][j]<rev[x][k])||(rev[x][j]<rev[x][i] && rev[x][j]>rev[x][k]))Xj.push_back(x);
                    if((rev[x][k]>rev[x][i] && rev[x][k]<rev[x][j])||(rev[x][k]<rev[x][i] && rev[x][k]>rev[x][j]))Xk.push_back(x);
                }

                if(sz(Xi)<=u && sz(Xj)<=u && sz(Xk)<=u)
                {
                    if(f(Xi) && f(Xj) && f(Xk))return 1;
                }

                //getLightest
                Xi.clear();
                Xj.clear();
                Xk.clear();
                for(auto &x:X)
                {
                    if(rev[x][i]<rev[x][j] && rev[x][i]<rev[x][k])Xi.push_back(x);
                    if(rev[x][j]<rev[x][i] && rev[x][j]<rev[x][k])Xj.push_back(x);
                    if(rev[x][k]<rev[x][i] && rev[x][k]<rev[x][j])Xk.push_back(x);
                }

                if(sz(Xi)<=u && sz(Xj)<=u && sz(Xk)<=u)
                {
                    if(f(Xi) && f(Xj) && f(Xk))return 1;
                }
                //getNextLightest
                for(int l=1;l<=6;l++)
                {
                    if(l!=i && l!=j && l!=k)
                    {
                        Xi.clear();
                        Xj.clear();
                        Xk.clear();
                        for(auto &x:X)
                        {
                            if(rev[x][l]>rev[x][i]&&rev[x][l]>rev[x][j]&&rev[x][l]>rev[x][k])
                            {
                                if(rev[x][i]<rev[x][j] && rev[x][i]<rev[x][k])Xi.push_back(x);
                                if(rev[x][j]<rev[x][i] && rev[x][j]<rev[x][k])Xj.push_back(x);
                                if(rev[x][k]<rev[x][i] && rev[x][k]<rev[x][j])Xk.push_back(x);
                            }
                            else
                            {
                                if(rev[x][l]<rev[x][i] && !(rev[x][l]<rev[x][j] && rev[x][j]<rev[x][i]) && !(rev[x][l]<rev[x][k] && rev[x][k]<rev[x][i]))Xi.push_back(x);
                                if(rev[x][l]<rev[x][j] && !(rev[x][l]<rev[x][i] && rev[x][i]<rev[x][j]) && !(rev[x][l]<rev[x][k] && rev[x][k]<rev[x][j]))Xj.push_back(x);
                                if(rev[x][l]<rev[x][k] && !(rev[x][l]<rev[x][i] && rev[x][i]<rev[x][k]) && !(rev[x][l]<rev[x][j] && rev[x][j]<rev[x][k]))Xk.push_back(x);
                            }
                        }
                        if(sz(Xi)<=u && sz(Xj)<=u && sz(Xk)<=u)
                        {
                            if(f(Xi) && f(Xj) && f(Xk))return 1;
                        }
                    }
                }
                
            }
        }
    }
    return 0;
}

void g(vector<int>X)
{
    int n=sz(X);
    if(n==1)
    {
        ans=X[0];
        return ;
    }
    int u=(n+2)/3;
    for(int i=1;i<=6;i++)
    {
        for(int j=i+1;j<=6;j++)
        {
            for(int k=j+1;k<=6;k++)
            {
                vector<int>Xi;
                vector<int>Xj;
                vector<int>Xk;
                
                //getHeaviest
                for(auto &x:X)
                {
                    if(rev[x][i]>rev[x][j] && rev[x][i]>rev[x][k])Xi.push_back(x);
                    if(rev[x][j]>rev[x][i] && rev[x][j]>rev[x][k])Xj.push_back(x);
                    if(rev[x][k]>rev[x][i] && rev[x][k]>rev[x][j])Xk.push_back(x);
                }

                if(sz(Xi)<=u && sz(Xj)<=u && sz(Xk)<=u)
                {
                    if(f(Xi) && f(Xj) && f(Xk))
                    {
                        int t=getHeaviest(i,j,k);
                        if(t==i)g(Xi);
                        else if(t==j)g(Xj);
                        else g(Xk);
                        return ;
                    }
                }
                //getMedian
                Xi.clear();
                Xj.clear();
                Xk.clear();
                for(auto &x:X)
                {
                    if((rev[x][i]>rev[x][j] && rev[x][i]<rev[x][k]) || (rev[x][i]<rev[x][j] && rev[x][i]>rev[x][k]))Xi.push_back(x);
                    if((rev[x][j]>rev[x][i] && rev[x][j]<rev[x][k])||(rev[x][j]<rev[x][i] && rev[x][j]>rev[x][k]))Xj.push_back(x);
                    if((rev[x][k]>rev[x][i] && rev[x][k]<rev[x][j])||(rev[x][k]<rev[x][i] && rev[x][k]>rev[x][j]))Xk.push_back(x);
                }

                if(sz(Xi)<=u && sz(Xj)<=u && sz(Xk)<=u)
                {
                    if(f(Xi) && f(Xj) && f(Xk))
                    {
                        int t=getMedian(i,j,k);
                        if(t==i)g(Xi);
                        else if(t==j)g(Xj);
                        else g(Xk);
                        return ;
                    }
                }

                //getLightest
                Xi.clear();
                Xj.clear();
                Xk.clear();
                for(auto &x:X)
                {
                    if(rev[x][i]<rev[x][j] && rev[x][i]<rev[x][k])Xi.push_back(x);
                    if(rev[x][j]<rev[x][i] && rev[x][j]<rev[x][k])Xj.push_back(x);
                    if(rev[x][k]<rev[x][i] && rev[x][k]<rev[x][j])Xk.push_back(x);
                }

                if(sz(Xi)<=u && sz(Xj)<=u && sz(Xk)<=u)
                {
                    if(f(Xi) && f(Xj) && f(Xk))
                    {
                        int t=getLightest(i,j,k);
                        if(t==i)g(Xi);
                        else if(t==j)g(Xj);
                        else g(Xk);
                        return ;
                    }
                }
                //getNextLightest
                for(int l=1;l<=6;l++)
                {
                    if(l!=i && l!=j && l!=k)
                    {
                        Xi.clear();
                        Xj.clear();
                        Xk.clear();
                        for(auto &x:X)
                        {
                            if(rev[x][l]>rev[x][i]&&rev[x][l]>rev[x][j]&&rev[x][l]>rev[x][k])
                            {
                                if(rev[x][i]<rev[x][j] && rev[x][i]<rev[x][k])Xi.push_back(x);
                                if(rev[x][j]<rev[x][i] && rev[x][j]<rev[x][k])Xj.push_back(x);
                                if(rev[x][k]<rev[x][i] && rev[x][k]<rev[x][j])Xk.push_back(x);
                            }
                            else
                            {
                                if(rev[x][l]<rev[x][i] && !(rev[x][l]<rev[x][j] && rev[x][j]<rev[x][i]) && !(rev[x][l]<rev[x][k] && rev[x][k]<rev[x][i]))Xi.push_back(x);
                                if(rev[x][l]<rev[x][j] && !(rev[x][l]<rev[x][i] && rev[x][i]<rev[x][j]) && !(rev[x][l]<rev[x][k] && rev[x][k]<rev[x][j]))Xj.push_back(x);
                                if(rev[x][l]<rev[x][k] && !(rev[x][l]<rev[x][i] && rev[x][i]<rev[x][k]) && !(rev[x][l]<rev[x][j] && rev[x][j]<rev[x][k]))Xk.push_back(x);
                            }
                        }
                        if(sz(Xi)<=u && sz(Xj)<=u && sz(Xk)<=u)
                        {
                            if(f(Xi) && f(Xj) && f(Xk))
                            {
                                int t=getNextLightest(i,j,k,l);
                                if(t==i)g(Xi);
                                else if(t==j)g(Xj);
                                else g(Xk);
                                return ;
                            }
                        }
                    }
                }
                
            }
        }
    }
    puts("mang");
}

void orderCoins() {
    
    vector<int>X;
    for(int i=0;i<720;i++)X.push_back(i);
    g(X);
    int W[6];
    for(int i=1;i<=6;i++)W[rev[ans][i]-1]=i;
    answer(W);
}

Compilation message (stderr)

scales.cpp: In function 'void init(int)':
scales.cpp:32:15: warning: unused parameter 'T' [-Wunused-parameter]
   32 | void init(int T) {
      |           ~~~~^
#Verdict Execution timeMemoryGrader output
Fetching results...