Submission #1219416

#TimeUsernameProblemLanguageResultExecution timeMemory
1219416Zbyszek99저울 (IOI15_scales)C++20
100 / 100
6 ms8268 KiB
#include "scales.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ll long long
#define ld long double
#define ull unsigned long long
#define ff first
#define ss second
#define pii pair<int,int>
#define pll pair<long long, long long>
#define vi vector<int>
#define vl vector<long long>
#define pb push_back
#define rep(i, b) for(int i = 0; i < (b); ++i)
#define rep2(i,a,b) for(int i = a; i <= (b); ++i)
#define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c)
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define siz(x) (int)(x).size()
#define forall(it,x) for(auto& it:(x))
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set;
mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());}
ll los(ll a, ll b) {return a + (mt() % (b-a+1));}
const int INF = 1e9+50;
const ll INF_L = 1e18+40;
const ll MOD = 1e9+7;

struct query
{
    int type;
    vi elms;
    int operator()()
    {
        if(type == 0)
        {
            return getHeaviest(elms[0]+1,elms[1]+1,elms[2]+1)-1;
        }
        if(type == 1)
        {
            return getLightest(elms[0]+1,elms[1]+1,elms[2]+1)-1;
        }
        if(type == 2)
        {
            return getMedian(elms[0]+1,elms[1]+1,elms[2]+1)-1;
        }
        if(type == 3)
        {
            return getNextLightest(elms[0]+1,elms[1]+1,elms[2]+1,elms[3]+1)-1;
        }
    }
};

vector<vi> perms;
vector<query> queries;
map<ull,int> real_tree;
vi tree_vals = {2,114,57,58,118,17,9,9,118,3,50,34,118,3,40,44,67,20,52,3,3,54,3,5,16,8,52,5,5,73,14,46,3,3,54,3,22,4,8,46,4,4,51,52,118,15,11,15,118,48,4,28,118,41,4,44,61,20,58,4,4,48,4,5,10,10,58,5,5,73,8,46,4,4,48,4,23,3,14,46,3,3,45,46,118,21,21,10,118,42,29,5,118,35,42,5,61,14,58,5,5,42,5,4,11,11,58,4,4,67,8,52,5,5,42,5,17,3,17,52,3,3,114,35,31,40,4,45,4,11,4,16,45,8,11,3,11,31,57,3,46,46,40,45,4,4,9,51,8,18,27,28,57,40,26,20,8,28,45,4,11,0,18,29,25,41,3,45,3,17,3,10,45,14,17,4,17,25,51,4,46,46,41,45,3,3,15,57,10,18,33,34,51,41,26,20,10,26,45,3,17,0,18,28,25,35,3,51,3,23,3,11,45,17,14,14,21,25,45,5,52,52,35,51,3,3,21,57,11,12,31,80,29,5,52,80,11,5,50,5,18,0,19,114,17,13,22,4,46,4,29,4,34,46,6,52,3,21,13,58,3,45,45,22,46,4,4,6,3,52,21,9,10,58,22,8,10,22,58,8,4,21,21,0,11,7,23,3,46,3,35,3,28,46,12,58,4,21,7,52,4,45,45,23,46,3,3,12,4,58,21,15,16,52,23,8,16,23,52,8,3,21,21,0,10,7,17,3,52,3,41,3,29,46,18,58,5,15,7,46,5,51,51,17,52,3,3,18,5,58,15,13,98,11,5,51,98,11,5,50,5,18,18,0};
ull P[1000001];

int get_ans(vi& p, query& q)
{
    int a = p[q.elms[0]];
    int b = p[q.elms[1]];
    int c = p[q.elms[2]];
    if(q.type == 0)
    {
        if(a > b && a > c) return q.elms[0];
        if(b > a && b > c) return q.elms[1];
        return q.elms[2];
    }
    if(q.type == 1)
    {
        if(a < b && a < c) return q.elms[0];
        if(b < a && b < c) return q.elms[1];
        return q.elms[2];
    }
    if(q.type == 2)
    {
        if((a < b && a > c) || (a < c && a > b)) return q.elms[0];
        if((b < a && b > c) || (b < c && b > a)) return q.elms[1];
        return q.elms[2];
    }
    if(q.type == 3)
    {
        pii ans = {1e9,0};
        rep(i,3)
        {
            if(p[q.elms[i]] > p[q.elms[3]])
            {
                ans = min(ans,{p[q.elms[i]],q.elms[i]});
            }
        }
        if(ans.ff != 1e9) return ans.ss;
        if(a < b && a < c) return q.elms[0];
        if(b < a && b < c) return q.elms[1];
        return q.elms[2];
    }
}

void gen_perms(vi cur, vi rest)
{
    if(siz(rest) == 0) 
    {
        perms.pb(cur);
        return;
    }
    rep(i,siz(rest))
    {
        int x = rest[i];
        cur.pb(x);
        swap(rest[i],rest[siz(rest)-1]);
        rest.pop_back();
        gen_perms(cur,rest);
        rest.pb(x);
        swap(rest[i],rest[siz(rest)-1]);
        cur.pop_back();
    }
}

int cur_node = 0;

vi buckets[7];

void gen_tree(vi p)
{
    ull H = 0;
    forall(it,p)
    {
        H += P[it];
    }
    if(siz(p) <= 1) return;
    int move = tree_vals[cur_node++];
    real_tree[H] = move;
    rep2(i,0,6) buckets[i] = {};
    vector<vi> perms2;
    forall(it,p)
    {
        buckets[get_ans(perms[it],queries[move])].pb(it);
    }
    rep2(i,0,6) perms2.pb(buckets[i]);
    forall(it,perms2)
    {
        gen_tree(it);
    }
}

void init(int T) 
{
    P[0] = 1;
    rep2(i,1,1000000) P[i] = (P[i-1] * 2137ULL);
    random_start();
    gen_perms({},{1,2,3,4,5,6});
    rep2(z1,0,5)
    {
        rep2(z2,z1+1,5)
        {
            rep2(z3,z2+1,5)
            {
                rep(d,3) queries.pb({d,{z1,z2,z3}});
                rep2(z,0,5)
                {
                    if(z != z1 && z != z2 && z != z3)
                    {
                        queries.pb({3,{z1,z2,z3,z}});
                    }
                }
            }
        }
    }
    vi pom;
    rep(i,siz(perms)) pom.pb(i);
    gen_tree(pom);
}

void gen_ans(vi p)
{
    ull H = 0;
    forall(it,p)
    {
        H += P[it];
    }
    if(siz(p) == 0) return;
    if(siz(p) == 1)
    {
        int W[] = {0,0,0,0,0,0};
        rep(i,6)
        {
            W[perms[p[0]][i]-1] = i+1;
        }
        answer(W);
        return;
    }
    int oper = real_tree[H];
    rep2(i,0,6) buckets[i] = {};
    forall(it,p)
    {
        buckets[get_ans(perms[it],queries[oper])].pb(it);
    }
    int val = queries[oper]();
    gen_ans(buckets[val]);
}

void orderCoins() 
{
    vi pom;
    rep(i,siz(perms)) pom.pb(i);
    gen_ans(pom);
}

Compilation message (stderr)

scales.cpp: In function 'int get_ans(std::vector<int>&, query&)':
scales.cpp:100:1: warning: control reaches end of non-void function [-Wreturn-type]
  100 | }
      | ^
scales.cpp: In member function 'int query::operator()()':
scales.cpp:53:5: warning: control reaches end of non-void function [-Wreturn-type]
   53 |     }
      |     ^
#Verdict Execution timeMemoryGrader output
Fetching results...