제출 #817123

#제출 시각아이디문제언어결과실행 시간메모리
817123gun_ganEkoeko (COCI21_ekoeko)C++17
110 / 110
13 ms4140 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MX = 2e5 + 5;
int N;
string S;
int curCnt[26], totCnt[26], pos[26][MX];
vector<int> a;

struct fw {
      int t[MX];
      void upd(int x, int val) {
            for(int i = x; i <= N; i += i & -i) t[i] += val;
      } 
      int que(int x) {
            int res = 0;
            for(int i = x; i > 0; i -= i & -i) res += t[i];
            return res;
      }
      int que(int l, int r) {
            return que(r) - que(l - 1);
      }

      void reset() {
            for(int i = 0; i < MX; i++) t[i] = 0;
      }
} ft;

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

      cin >> N >> S;
      for(auto x : S) a.push_back(x - 'a');

      for(auto x : a)
            totCnt[x]++;

      int i = 0, r = 0;
      vector<pair<int,int>> v;

      ll ans = 0;
      for(auto x : a) {
            if(curCnt[x] < totCnt[x] / 2) {
                  pos[x][curCnt[x]] = i;
                  ans += r;
            } else {
                  pos[x][curCnt[x]] = i;
                  v.push_back({pos[x][curCnt[x] - totCnt[x] / 2], r});
                  r++;
            }
            curCnt[x]++;
            i++;
      }

      sort(v.begin(), v.end());

      ft.reset();

      for(auto [l, r] : v) {
            ans += ft.que(r + 1, N);
            ft.upd(r + 1, 1);
      }      

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