Submission #1003820

#TimeUsernameProblemLanguageResultExecution timeMemory
1003820vjudge1Ekoeko (COCI21_ekoeko)C++17
110 / 110
13 ms3836 KiB
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
const int MAXN = 2e5+5;
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define pb push_back
#define fr first
#define sc second

int n, bit[MAXN];
string v;
vector<int> L[26];

void update(int x, int val) {
    for( ; x <= n; x += x&-x)
        bit[x] += val;
}

int sum(int x) {
    int cnt = 0;
    while(x > 0) {
        cnt += bit[x];
        x -= x&-x;
    }
    return cnt;
}
int main() {

    cin >> n >> v;
    n *= 2;

    for(int i = 0; i < n; i++) L[v[i] - 'a'].pb(i+1);

    vector<pii> p;

    for(int i = 0; i < 26; i++)
        for(int j = 0; j < sz(L[i])/2; j++) 
            p.pb({L[i][j], L[i][j + sz(L[i])/2]});

    vector<int> flag(n+1);

    for(auto [a,b] : p) flag[a] = -1, flag[b] = a;//, cout << a << " " << b << "\n";

    ll ans = 0;
    for(int i = 1; i <= n; i++) {
        if(flag[i] != -1) {
            update(flag[i], -1);
            ans += sum(flag[i]);
        }
        else {
            update(i, 1);
            int x = sum(i-1);
            ans += ((i-1) - x)/2; 
        }
    }

    cout << ans << "\n";
}
#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...