Submission #774628

#TimeUsernameProblemLanguageResultExecution timeMemory
774628OzyEkoeko (COCI21_ekoeko)C++17
110 / 110
26 ms6408 KiB
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define lli long long int
#define debug(a) cout << #a << " = " << a << endl
#define debugsl(a) cout << #a << " = " << a << ", "
#define rep(i,a,b) for(int i = (a); i <= (b); i++)
#define repa(i,a,b) for(int i = (a); i >= (b); i--)
#define pll pair<lli,lli>

#define MAX 100000
//para el vector de orden
#define val first
#define id second

lli n,a,arr[MAX*2+2],res,cont,c_2,offset;
string st;
lli cant[30],n_cant[30];
vector<pll> orden;
queue<lli> p_real[30];
lli stree[MAX*4];

lli query(lli pos, lli ini, lli fin, lli l, lli r) {

    if (ini > r || fin < l) return 0;
    if (l <= ini && fin <= r) return stree[pos];

    lli mitad = (ini+fin)/2;
    lli a = query(pos*2,ini,mitad,l,r);
    lli b = query(pos*2+1,mitad+1,fin,l,r);
    return a+b;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n >> st;
    rep(i,1,2*n) {
        a = st[i-1] - 'a';
        arr[i] = a;
        cant[a]++;
    }

    //dividir en 2 mitades sumar lo que le corresponde al resultado
    cont = 1;
    c_2 = 1;
    rep(i,1,n*2) {
        n_cant[arr[i]]++;
        if (n_cant[arr[i]] <= cant[arr[i]]/2) {

            p_real[arr[i]].push(cont);
            res += i - cont;
            cont++;
        }
        else {
            //debug(i);

            orden.push_back({p_real[arr[i]].front(), c_2});
            p_real[arr[i]].pop();
            c_2++;
        }
    }

    //procesar el vector de orden y actualizar el stree
    sort(orden.begin(), orden.end());

    offset = 1;
    while (offset < n) offset *= 2;
    for(auto act : orden) {
        res += query(1,1,offset,act.id,offset);
        a = offset+act.id-1;
        while(a != 0) {
            stree[a]++;
            a/=2;
        }
    }

    cout << res;

    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...