Submission #1329927

#TimeUsernameProblemLanguageResultExecution timeMemory
1329927daveleLanguages (IOI10_languages)C++20
100 / 100
2009 ms190536 KiB
#ifndef davele
#include "grader.h"
#endif // davele

#include <bits/stdc++.h>
#define pb push_back
#define pii pair<int, int>
#define fi first
#define se second
using namespace std;
const int base = 70001, mod = 1e6+3;

mt19937_64 rng (chrono::high_resolution_clock::now().time_since_epoch().count());
int rand (int l, int r){
    return uniform_int_distribution <int> (l, r) (rng);
}

set <int> let[65536];
int db[60][mod+1];
double score[60];

void excerpt (int A[]){
    double alpha = 10000.0;
    double beta = 10000.0;
    double phi = 30000.0;
    for (int i=0; i<56; i++) score[i] = 0;
    for (int i=0; i<100; i++){
        int v = A[i];
        if (let[v].empty()) continue;
        double tm = alpha/let[v].size();
        for (int x:let[v]){
            score[x]+=tm;
        }
    }
    for (int i=0; i+1<100; i++){
        int val = 1ll*(1ll*A[i]*base+A[i+1])%mod;
        vector <pii> bonus;
        int tot = 0;
        for (int lang = 0; lang<56; lang++){
            if (db[lang][val]>0){
                int ts = db[lang][val];
                tot+=ts;
                bonus.pb({lang, ts});
            }
        }
        if (bonus.empty()) continue;
        double tm = beta/tot;
        for (pii lang:bonus){
            score[lang.fi]+=tm*lang.se;
        }
    }
    for (int i=0; i+2<100; i++){
        int val = (1ll*(1ll*(1ll*A[i]*base+A[i+1])%mod)*base+A[i+2])%mod;
        vector <pii> bonus;
        int tot = 0;
        for (int lang = 0; lang<56; lang++){
            if (db[lang][val]>0){
                int ts = db[lang][val];
                tot+=ts;
                bonus.pb({lang, ts});
            }
        }
        if (bonus.empty()) continue;
        double tm = phi/tot;
        for (pii lang:bonus){
            score[lang.fi]+=tm*lang.se;
        }
    }
    double maxi = 0;
    for (int i=0; i<56; i++){
        maxi = max (maxi, score[i]);
    }
    vector <int> candidate;
    for (int i=0; i<56; i++) if (maxi==score[i]){
        candidate.pb(i);
    }
    shuffle (candidate.begin(), candidate.end(), rng);
    int ret = language(candidate[0]);
    for (int i=0; i<100; i++){
        int v = A[i];
        let[v].insert(ret);
    }
    for (int i=0; i+1<100; i++){
        int val = 1ll*(1ll*A[i]*base+A[i+1])%mod;
        db[ret][val]++;
    }
    for (int i=0; i+2<100; i++){
        int val = (1ll*(1ll*(1ll*A[i]*base+A[i+1])%mod)*base+A[i+2])%mod;
        db[ret][val]++;
    }
}

#ifdef davele
signed main(){

}
#endif // davele
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...