Submission #920311

#TimeUsernameProblemLanguageResultExecution timeMemory
920311vjudge1Diversity (CEOI21_diversity)C++17
64 / 100
7021 ms8280 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
#include <cstring>
#include <set>
#warning That's the baby, that's not my baby

typedef long long ll;

const int NMAX = 3e5;

int a[NMAX + 1];
int f[NMAX + 1];

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

  int n, q;
  std::cin >> n >> q;

  std::vector<int> norm;
  for (int i = 1; i <= n; i++) {
    std::cin >> a[i];
    norm.push_back(a[i]);
  }

  std::sort(norm.begin(), norm.end());
  norm.erase(std::unique(norm.begin(), norm.end()), norm.end());

  for (int i = 1; i <= n; i++) {
    a[i] = std::lower_bound(norm.begin(), norm.end(), a[i]) - norm.begin();
  }

  /**

  1 * (f[1] + f[2] + ... + f[k]) +
  2 * (f[1] * f[2] + f[2] * f[3] + f[3] * f[4] + ... + f[k - 1] * f[k]) +
  3 * (f[1] * f[3] + f[2] * f[4] + ...) +
  ...

  **/

  while (q--) {
    int l, r;
    std::cin >> l >> r;
    std::vector<int> b;
    memset(f, 0, sizeof(f));
    for (int i = l; i <= r; i++) {
      f[a[i]]++;
    }
    std::vector<int> fr;
    for (int i = 0; i < NMAX; i++) {
      if (f[i] != 0) {
        fr.push_back(f[i]);
      }
    }

    std::sort(fr.begin(), fr.end());

    ll answer = 0;

    std::vector<int> frr;
    for (int i = 0; i < (int) fr.size(); i += 2) {
      frr.push_back(fr[i]);
    }
    int sz = (int) frr.size();
    for (int i = 1; i < (int) fr.size(); i += 2) {
      frr.push_back(fr[i]);
    }
    std::reverse(frr.begin() + sz, frr.end());
    fr = frr;
    int m = (int) fr.size();
    ll add = 0, sum = 0;
    for (int i = 0; i < m; i++) {
      ll cur = 0;
//      for (int j = 0; j < i; j++) {
//        cur += (ll) (i - j + 1) * fr[j];
//      }
      answer += (ll) fr[i] * add;
      sum += fr[i];
      add += sum + fr[i];
    }

    /**

    for i=0..m-1:
      for j=0..i-1:
        cur += (i - j) * fr[j]


    **/

    for (const auto &x : fr) {
      answer += (ll) x * (x + 1) / 2;
    }

    std::cout << answer << '\n';
  }

  return 0;
}

Compilation message (stderr)

diversity.cpp:7:2: warning: #warning That's the baby, that's not my baby [-Wcpp]
    7 | #warning That's the baby, that's not my baby
      |  ^~~~~~~
diversity.cpp: In function 'int main()':
diversity.cpp:77:10: warning: unused variable 'cur' [-Wunused-variable]
   77 |       ll cur = 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...
#Verdict Execution timeMemoryGrader output
Fetching results...