Submission #503344

#TimeUsernameProblemLanguageResultExecution timeMemory
503344rainboyEkoeko (COCI21_ekoeko)C11
110 / 110
8 ms2592 KiB
#include <stdio.h> #include <string.h> #define N 100000 #define A 26 int ft[N * 2]; void update(int i, int n) { while (i < n) { ft[i]++; i |= i + 1; } } int query(int i) { int x = 0; while (i >= 0) { x += ft[i]; i &= i + 1, i--; } return x; } int main() { static char cc[N * 2 + 1]; static int kk[A], hh[A], ii[N * 2], aa[N * 2], rr[N * 2]; int n, h, h_, i, k, a; long long ans; scanf("%d%s", &n, cc); for (i = 0; i < n * 2; i++) kk[cc[i] - 'a']++; for (a = 1; a < A; a++) hh[a] = hh[a - 1] + kk[a - 1]; for (i = 0; i < n * 2; i++) ii[aa[i] = hh[cc[i] - 'a']++] = i; memset(rr, -1, n * 2 * sizeof *rr); for (a = 0, h = 0; a < A; h += kk[a], a++) for (h_ = h; h_ < h + kk[a] / 2; h_++) rr[ii[h_]] = ii[h_ + kk[a] / 2]; ans = 0; for (i = n * 2 - 1, k = 0; i >= 0; i--) if (rr[i] != -1) k++; else ans += k; for (i = n * 2 - 1, k = 0; i >= 0; i--) if (rr[i] != -1) { ans += query(rr[i] - 1); update(rr[i], n * 2); } printf("%lld\n", ans); return 0; }

Compilation message (stderr)

Main.c: In function 'main':
Main.c:32:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   32 |  scanf("%d%s", &n, cc);
      |  ^~~~~~~~~~~~~~~~~~~~~
#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...