Submission #532704

#TimeUsernameProblemLanguageResultExecution timeMemory
532704ivan24Scales (IOI15_scales)C++14
72.62 / 100
476 ms540 KiB
#include "scales.h"
#include<bits/stdc++.h>
using namespace std;

using ll = long long int;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef pair<ll,ll> ii;
typedef vector<ii> vii;
typedef vector<vii> vvii;
#define F first
#define S second

ll min (ll x, ll y){
    return ((x < y) ? x : y);
}

ll max (ll x, ll y){
    return ((x > y) ? x : y);
}

const ll INF = 1e18;

class Solution {
private:
    vi w;
    vi idx;
public:
    Solution (){

    }
    Solution (vi _w): w(_w){
        idx.resize(7);
        for (ll i = 0; 6 > i; i++) idx[w[i]] = i;
    }
    ll test (ll type, vi params){
        if (3 > type){
            vii v;
            for (auto i: params) v.emplace_back(idx[i],i);
            sort(v.begin(),v.end());
            return v[type].S;
        }else{
            vii v;
            for (auto i: params) v.emplace_back(idx[i],i);
            v.pop_back();
            sort(v.begin(),v.end());
            ll target = idx[params[3]];
            for (ll i = 0; v.size() > i; i++){
                if (v[i].F > target) return v[i].S;
            }
            return v[0].S;
        }
    }
    vi get_w(){
        return w;
    }
};

class SolutionSet {
private:
    vector<Solution> space;
    vector<pair<ll,vi> > history;
    ll try_test (ll type, vi params) {
        ll res = 0;
        vi vcur; vcur.assign(7,0);
        for (auto i: space){
            ll cur = i.test(type,params);
            vcur[cur]++;
        }
        for (auto i: vcur) res += i*i;
        return res;
    }
public:
    SolutionSet(){
        vi cur_w;
        for (ll i = 0; 6 > i; i++) cur_w.push_back(i+1);
        do{
            space.push_back(Solution(cur_w));
        }while (next_permutation(cur_w.begin(),cur_w.end()));
    }
    ll get_size(){
        return space.size();
    }
    void best_test(){
        ll cur = INF, curt;
        vi curparam;
        for (ll t = 0; 3 > t; t++){
            for (ll i = 1; 6 >= i; i++){
                for (ll j = i+1; 6 >= j; j++){
                    for (ll k = j+1; 6 >= k; k++){
                        ll curscore = try_test(t,vi{i,j,k});
                        if (curscore < cur){
                            cur = curscore; curt = t; curparam = vi{i,j,k};
                        }
                    }
                }
            }
        }

        for (ll i = 1; 6 >= i; i++){
            for (ll j = i+1; 6 >= j; j++){
                for (ll k = j+1; 6 >= k; k++){
                    for (ll o = 1; 6 >= o; o++){
                        if ((o == i) || (o == j) || (o == k)) continue;
                        ll curscore = try_test(3,vi{i,j,k,o});
                        if (curscore < cur){
                            cur = curscore; curt = 3; curparam = vi{i,j,k,o};
                        }
                    }
                }
            }
        }

        ll res;
        if (curt == 0){
            res = getLightest(curparam[0],curparam[1],curparam[2]);
        }else if (curt == 1){
            res = getMedian(curparam[0],curparam[1],curparam[2]);
        }else if (curt == 2){
            res = getHeaviest(curparam[0],curparam[1],curparam[2]);
        }else
            res = getNextLightest(curparam[0],curparam[1],curparam[2],curparam[3]);

        vector<Solution> newspace;
        for (auto i: space){
            if (i.test(curt,curparam) == res) newspace.push_back(i);
        }
        space = newspace;
    }

    vi answer(){
        return space[0].get_w();
    }
};

void init(int t) {
    /* ... */
}

void orderCoins() {
    /* ... */
    SolutionSet mySol;

    while (mySol.get_size() != 1){
        mySol.best_test();
    }

    vi res = mySol.answer();
    int w[] = {1,2,3,4,5,6};
    for (ll i = 0; 6 > i; i++) w[i] = res[i];
    answer(w);

    /*
    ll p_r = 0, p_l = 0;
    while (p_r != 3 || p_l != 3){
        if (p_r == 3){
            w[p_l+p_r] = l_ar[p_l];
            p_l++;
        }else if (p_l == 3){
            w[p_l+p_r] = r_ar[p_r];
            p_r++;
        }else{
            ll cur;
            if (p_l == 2 && p_r == 2){
                cur = getMedian(l_ar[1],l_ar[2],r_ar[2]);
            }else if (p_r == 2){
                cur = getLightest(l_ar[p_l],l_ar[p_l+1],r_ar[p_r]);
            }else if (p_l == 2){
                cur = getLightest(l_ar[p_l],r_ar[p_r+1],r_ar[p_r]);
            }else{
                cur = getLightest(l_ar[p_l],r_ar[p_r+1],r_ar[p_r]);
            }
            w[p_l+p_r] = cur;
            if (cur == l_ar[p_l]){
                p_l++;
            }else{
                p_r++;
            }
        }
    }

    w[5] = 21;
    for (ll i = 0; 4 >= i; i++) w[5] -= w[i];
    */
}

Compilation message (stderr)

scales.cpp: In member function 'll Solution::test(ll, vi)':
scales.cpp:48:37: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   48 |             for (ll i = 0; v.size() > i; i++){
      |                            ~~~~~~~~~^~~
scales.cpp: In member function 'void SolutionSet::best_test()':
scales.cpp:116:66: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
  116 |             res = getLightest(curparam[0],curparam[1],curparam[2]);
      |                                                                  ^
scales.cpp:116:66: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
scales.cpp:116:66: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
scales.cpp:118:64: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
  118 |             res = getMedian(curparam[0],curparam[1],curparam[2]);
      |                                                                ^
scales.cpp:118:64: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
scales.cpp:118:64: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
scales.cpp:120:66: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
  120 |             res = getHeaviest(curparam[0],curparam[1],curparam[2]);
      |                                                                  ^
scales.cpp:120:66: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
scales.cpp:120:66: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
scales.cpp:122:82: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
  122 |             res = getNextLightest(curparam[0],curparam[1],curparam[2],curparam[3]);
      |                                                                                  ^
scales.cpp:122:82: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
scales.cpp:122:82: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
scales.cpp:122:82: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
scales.cpp: In function 'void init(int)':
scales.cpp:136:15: warning: unused parameter 't' [-Wunused-parameter]
  136 | void init(int t) {
      |           ~~~~^
scales.cpp: In function 'void orderCoins()':
scales.cpp:150:44: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
  150 |     for (ll i = 0; 6 > i; i++) w[i] = res[i];
      |                                            ^
scales.cpp: In member function 'void SolutionSet::best_test()':
scales.cpp:126:23: warning: 'curt' may be used uninitialized in this function [-Wmaybe-uninitialized]
  126 |             if (i.test(curt,curparam) == res) newspace.push_back(i);
      |                 ~~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...