Submission #1160544

#TimeUsernameProblemLanguageResultExecution timeMemory
1160544ffresh역사적 조사 (JOI14_historical)C++20
100 / 100
388 ms10768 KiB
#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>

#if __cplusplus >= 201103L
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#endif

// C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

#if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#endif

#include <ranges>

#define ll long long
using namespace std;

const int N = 1e5 + 15;

int a[N];

int uniqueValueIdx[N];

ll importances[N];

vector<int> getUniqueValues(int n)
{
  vector<int> uniqueValues(n);
  for (int i = 1; i <= n; ++i)
  {
    uniqueValues[i - 1] = a[i];
  }
  sort(uniqueValues.begin(), uniqueValues.end());
  uniqueValues.erase(unique(uniqueValues.begin(), uniqueValues.end()), uniqueValues.end());
  return uniqueValues;
}

void calculateUniqueValueIdx(int n)
{
  vector<int> uniqueValues = getUniqueValues(n);
  for (int i = 1; i <= n; ++i)
  {
    uniqueValueIdx[i] = lower_bound(uniqueValues.begin(), uniqueValues.end(), a[i]) - uniqueValues.begin();
  }
}

vector<int> importanceIdx[N];

void calculateImportance(int n)
{
  importances[0] = 0;
  vector<int> cnt(n + 1, 0);
  for (int i = 1; i <= n; ++i)
  {
    int id = uniqueValueIdx[i];
    ++cnt[id];
    importances[i] = (ll)cnt[id] * a[i];
  }
  sort(importances, importances + n + 1);
  int uniqueImportanceSize = unique(importances, importances + n + 1) - importances;

  for (int i = 1; i <= n; ++i)
  {
    int id = uniqueValueIdx[i];
    if (importanceIdx[id].empty())
    {
      importanceIdx[id].push_back(0);
    }
  }

  fill(cnt.begin(), cnt.end(), 0);
  for (int i = 1; i <= n; ++i)
  {
    int id = uniqueValueIdx[i];
    ++cnt[id];
    int importanceIndex = lower_bound(importances, importances + uniqueImportanceSize, (ll)cnt[id] * a[i]) - importances;
    importanceIdx[id].push_back(importanceIndex);
  }
}

const int SQ = 400;

struct Query
{
  int l, r, idx;

  bool operator<(const Query &other) const
  {
    return r < other.r;
  }
};

vector<Query> queries[SQ];

void processQuery(int n, int m)
{
  for (int i = 0; i < m; ++i)
  {
    int x, y;
    scanf("%d %d", &x, &y);
    queries[x / SQ].push_back({x, y, i});
  }

  vector<int> cnt(n + 1, 0);
  vector<int> sqCnt(SQ, 0);

  auto add = [&](int idx)
  {
    ++cnt[idx];
    ++sqCnt[idx / SQ];
  };

  auto remove = [&](int idx)
  {
    --cnt[idx];
    --sqCnt[idx / SQ];
  };

  auto findAnswer = [&]() -> ll
  {
    for (int i = SQ - 1; i >= 0; --i)
    {
      if (sqCnt[i] > 0)
      {
        int maxi = min(i * SQ + (SQ - 1), n);
        int mini = i * SQ;
        for (int j = maxi; j >= mini; --j)
        {
          if (cnt[j] > 0)
          {
            return importances[j];
          }
        }
      }
    }
    return 0LL;
  };

  for (int i = 0; i < SQ; ++i)
  {
    sort(queries[i].begin(), queries[i].end());
  }

  for (int i = 1; i <= n; ++i)
  {
    add(0);
  }

  int ql = 1, qr = 0;

  vector<ll> ans(m);

  vector<int> cnt2(n + 1, 0);

  for (int i = 0; i < SQ; ++i)
  {
    for (auto &query : queries[i])
    {
      int l = query.l, r = query.r;

      while (qr < r)
      {
        int id = uniqueValueIdx[++qr];
        int importIdx = importanceIdx[id][cnt2[id]];
        remove(importIdx);
        ++cnt2[id];
        importIdx = importanceIdx[id][cnt2[id]];
        add(importIdx);
      }

      while (l < ql)
      {
        int id = uniqueValueIdx[--ql];
        int importIdx = importanceIdx[id][cnt2[id]];
        remove(importIdx);
        ++cnt2[id];
        importIdx = importanceIdx[id][cnt2[id]];
        add(importIdx);
      }

      while (r < qr)
      {
        int id = uniqueValueIdx[qr--];
        int importIdx = importanceIdx[id][cnt2[id]];
        remove(importIdx);
        --cnt2[id];
        importIdx = importanceIdx[id][cnt2[id]];
        add(importIdx);
      }

      while (ql < l)
      {
        int id = uniqueValueIdx[ql++];
        int importIdx = importanceIdx[id][cnt2[id]];
        remove(importIdx);

        --cnt2[id];
        importIdx = importanceIdx[id][cnt2[id]];
        add(importIdx);
      }

      ans[query.idx] = findAnswer();
    }
  }

  for (int i = 0; i < m; ++i)
  {
    printf("%lld\n", ans[i]);
  }
}

void solve2()
{
  int n, m;
  scanf("%d %d", &n, &m);

  for (int i = 1; i <= n; ++i)
  {
    scanf("%d", &a[i]);
  }

  calculateUniqueValueIdx(n);
  calculateImportance(n);
  processQuery(n, m);
}

void solve()
{
  // init();
  // int t;
  // scanf("%d",&t);
  // while(t--)
  solve2();
}

int main()
{
  // cin,cout fast

  // ios_base::sync_with_stdio(false);

  solve();
  return 0;
}

Compilation message (stderr)

historic.cpp: In function 'void processQuery(int, int)':
historic.cpp:174:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  174 |     scanf("%d %d", &x, &y);
      |     ~~~~~^~~~~~~~~~~~~~~~~
historic.cpp: In function 'void solve2()':
historic.cpp:289:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  289 |   scanf("%d %d", &n, &m);
      |   ~~~~~^~~~~~~~~~~~~~~~~
historic.cpp:293:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  293 |     scanf("%d", &a[i]);
      |     ~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...