제출 #866539

#제출 시각아이디문제언어결과실행 시간메모리
866539TAhmed33Ekoeko (COCI21_ekoeko)C++98
110 / 110
14 ms7904 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int MAXN = 2e5 + 25; struct bit { int tree[MAXN] = {}; void add (int x) { if (x < 0 || x > MAXN) return; for (; x < MAXN; x += x & (-x)) tree[x]++; } int get (int x) { if (x < 0 || x > MAXN) return 0; int sum = 0; for (; x; x -= x & (-x)) sum += tree[x]; return sum; } } cur; int n; string s; vector <int> occ[26]; int pref[MAXN]; signed main () { ios::sync_with_stdio(0); cin.tie(0); memset(cur.tree, 0, sizeof(cur.tree)); cin >> n >> s; s.insert(s.begin(), '0'); for (int i = 1; i <= 2 * n; i++) occ[s[i] - 'a'].push_back(i); vector <pair <int, int>> ll2; for (int i = 0; i < 26; i++) { if (occ[i].empty()) continue; for (int j = (int)occ[i].size() / 2; j < (int)occ[i].size(); j++) { ll2.push_back({occ[i][j - (int)occ[i].size() / 2], occ[i][j]}); pref[occ[i][j]]++; } } sort(ll2.begin(), ll2.end()); ll2.insert(ll2.begin(), {0, 0}); for (int i = 1; i <= 2 * n; i++) pref[i] += pref[i - 1]; int sum = 0; int sum2 = 0; for (int i = 1; i <= n; i++) { sum += pref[ll2[i].first]; sum2 += cur.get(ll2[i].second); cur.add(ll2[i].second); } cout << sum + n * (n - 1) / 2 - sum2 << '\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...