Submission #1318317

#TimeUsernameProblemLanguageResultExecution timeMemory
1318317spetrDiversity (CEOI21_diversity)C++20
0 / 100
1 ms412 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
const ll mmod = 998244353;  
#define vl vector<long long>
#define vll vector<vector<long long>>
#define pl pair<long long, long long>
#define vb vector<bool>

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    ll n, q;
    if (!(cin >> n >> q)) return 0;
    
    vl nums(n);
    // Použijeme mapu pro bezpečné počítání četností (funguje i pro velká čísla druhů)
    map<ll, ll> counts;
    
    for (ll i = 0; i < n; i++){
        cin >> nums[i];
        counts[nums[i]]++;
    }
    
    ll l, r;
    cin >> l >> r;

    // Vytvoříme páry {četnost, druh} pouze pro unikátní druhy
    vector<pl> pary;
    for (auto const& [species, count] : counts) {
        pary.push_back({count, species});
    }
    
    // Seřadíme podle četnosti (méně četné druhy na začátek)
    sort(pary.begin(), pary.end());
    
    nums.clear();
    // Rekonstrukce pole - nyní bude mít správnou délku N
    for (auto x : pary){
        for (ll i = 0; i < x.first; i++){
            nums.push_back(x.second);
        }
    }
    
    // DP výpočet celkové diverzity
    // dp[i] = součet diverzit všech podposloupností končících na indexu i
    vl dp (n, 1);
    
    // Base case pro index 0 je již nastaven na 1
    for (ll i = 1; i < n; i++){
        if (nums[i] == nums[i-1]){
            // Pokud je zvíře stejné jako předchozí, diverzita se zvedne jen o 1 (pro samotné nové zvíře)
            // v rámci existujících podposloupností se "nepřičítá", protože druh už tam je.
            dp[i] = dp[i-1] + 1;
        }
        else{
            // Pokud je to nové zvíře (vzhledem k seřazení a seskupení to znamená, 
            // že tento druh se v předchozích podposloupnostech končících na i-1 nevyskytoval),
            // zvýší diverzitu všech (i+1) podposloupností končících na i o 1.
            dp[i] = dp[i-1] + (i + 1);
        }
    }
    
    ll suma = 0;
    for (ll i = 0; i < n; i++){
        suma += dp[i];
    }
    
    cout << suma << "\n";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...