제출 #1332091

#제출 시각아이디문제언어결과실행 시간메모리
1332091eri16Scales (IOI15_scales)C++20
39.12 / 100
1 ms344 KiB
#include<bits/stdc++.h>
#include "scales.h"

using namespace std;
using ll = long long;

#define fi first
#define se second

bool arr[7][7];

vector <int> vec;

ll qq=0;

/*
int getLightest(int x, int y, int z){
    // return index (1..6) of the lightest among x,y,z
    qq++;
    int ax = vec[x-1], ay = vec[y-1], az = vec[z-1];
    int mn = min({ax, ay, az});
    if (ax == mn) return x;
    if (ay == mn) return y;
    return z;
}

int getHeaviest(int x, int y, int z){
    // return index (1..6) of the heaviest among x,y,z
    qq++;
    int ax = vec[x-1], ay = vec[y-1], az = vec[z-1];
    int mx = max({ax, ay, az});
    if (ax == mx) return x;
    if (ay == mx) return y;
    return z;
}

int getMedian(int x, int y, int z){
    // return index (1..6) of the median among x,y,z
    qq++;
    int ax = vec[x-1], ay = vec[y-1], az = vec[z-1];
    // median by comparisons
    if ((ax <= ay && ax >= az) || (ax >= ay && ax <= az)) return x;
    if ((ay <= ax && ay >= az) || (ay >= ax && ay <= az)) return y;
    return z;
}
*/
vector <bool> vis(7);

void dfs(int node){
    if (!vis[node]){
        vis[node]=true;
        
        for (int i=1; i<7; i++){
            if (arr[node][i]){
                dfs(i);
                for (int j=1; j<7; j++){
                    if (arr[i][j]){
                        arr[node][j]=true;
                    }
                }
            }
        }
    }
}

bool cmp(int x, int y){
    for (int i=1; i<7; i++){vis[i]=false;}
    
    for (int i=1; i<7; i++){dfs(i);}
    
    if (arr[y][x]){return true;}
    if (arr[x][y]){return false;}
    
    for (int i=1; i<7; i++){
        if (arr[x][i]==1){
            int ans = getMedian(x,y,i);
            if (ans==y){
                arr[x][y]=1;
                arr[y][i]=1;
                return false;
            }
            if (ans==x){
                arr[y][x]=1;
                arr[y][i]=1;
                return true;
            }
            if (ans==i){
                arr[i][y]=1;
                arr[x][y]=1;
                return false;
            }
        }
        if (arr[i][x]==1){
            int ans = getMedian(x,y,i);
            if (ans==y){
                arr[i][y]=1;
                arr[y][x]=1;
                return true;
            }
            if (ans==x){
                arr[i][y]=1;
                arr[x][y]=1;
                return false;
            }
            if (ans==i){
                arr[y][i]=1;
                arr[y][x]=1;
                return true;
            }
        }
        if (arr[y][i]==1){
            int ans = getMedian(x,y,i);
            if (ans==y){
                arr[x][y]=1;
                arr[x][i]=1;
                return false;
            }
            if (ans==x){
                arr[y][x]=1;
                arr[x][i]=1;
                return true;
            }
            if (ans==i){
                arr[y][x]=1;
                arr[i][x]=1;
                return true;
            }
        }
        
        if (arr[i][y]==1){
            int ans = getMedian(x,y,i);
            if (ans==y){
                arr[i][x]=1;
                arr[y][x]=1;
                return true;
            }
            if (ans==x){
                arr[i][x]=1;
                arr[x][y]=1;
                return false;
            }
            if (ans==i){
                arr[x][i]=1;
                arr[x][y]=1;
                return true;
            }
        }
    }
    
    for (int i=1; i<7; i++){
        if (i!=x && i!=y){
            
            int ans = getHeaviest(x,y,i);
            if (ans==i){
                arr[i][x]=1;
                arr[i][y]=1;
                
                ans = getLightest(x,y,i);
                
                if (ans==x){arr[y][x]=1;return true;}
                if (ans==y){arr[x][y]=1;return false;}
            }
            
            if (ans==x){
                arr[x][i]=1;
                arr[x][y]=1;
                return false;
            }
            
            if (ans==y){
                arr[y][i]=1;
                arr[y][x]=1;
                return true;
            }
        }
    }
    
    cout<<"broke";
    return false;
}

void init(int T){}
/*
void answer(vector <int> v){
    for (auto x : v){cout<<x<<' ';}
    cout<<"\n";
    
    for (int i=1; i<7; i++){
        for (int j=1; j<7; j++){
            cout<<arr[i][j]<<' ';
        }
        cout<<"\n";
    }
}
*/
void orderCoins(){
    for (int i=0; i<7; i++){
        for (int j=0; j<7; j++){
            arr[i][j]=false;
        }
    }
    
    vector <int> v = {1,2,3,4,5,6};
    
    stable_sort(v.begin(),v.end(), cmp);
    stable_sort(v.begin(),v.end(), cmp);
    stable_sort(v.begin(),v.end(), cmp);
    answer(v.data());
}
#Verdict Execution timeMemoryGrader output
Fetching results...