WA求助
查看原帖
WA求助
55211
LitDarkness楼主2022/3/23 19:29
#include <bits/stdc++.h>
using namespace std;
namespace io {
template<typename T>inline void read(T &x) {
  char ch, f = 0; x = 0;
  while (!isdigit(ch = getchar())) f |= ch == '-';
  while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
  x = f? -x: x;
}
char ch[40];
template<typename T>inline void write(T x) {
  (x < 0) && (putchar('-'), x = -x);
  x || putchar('0');
  int i = 0;
  while (x) ch[i++] = x % 10 ^ 48, x /= 10;
  while (i) putchar(ch[--i]);
}
}
#define rd io::read
#define wt io::write
const int maxN = 1e5 + 5;
typedef long long ll;
int dcnt[maxN], bel[maxN];
int n, m, a[maxN], b[maxN], len;
ll ans, Ans[maxN], bkv;
int dl;
struct Node {
  int l, r, id;
  bool operator< (const Node &a) { return bel[l] == bel[a.l] ? r < a.r : l < a.l; }
}qu[maxN];
inline void save(int l) {
  dl = l; bkv = ans;
}
inline void roll_back(int &l) {
  ans = bkv;
  while (l < dl) --dcnt[a[l++]];
}
inline ll query(int x, int y) {
  ll mx = 0;
  for (int i = x; i <= y; ++i)
    mx = max(1LL * (++dcnt[a[i]]) * b[a[i]], mx);
  for (int i = x; i <= y; ++i)
    --dcnt[a[i]];
  return mx;
}
inline void add(int x) { ans = max(ans, 1LL * (++dcnt[a[x]]) * b[a[x]]); }
int main() {
#ifdef LOCAL
  clock_t startTime = clock();
  freopen("1.in", "r", stdin);
  freopen("1.out", "w", stdout);
#endif
  //
  rd(n); rd(m); len = sqrt(n);
  for (int i = 1; i <= n; ++i) {
    rd(a[i]); bel[i] = (i + len - 1) / len;
    b[i] = a[i];
  }
  sort(b + 1, b + n + 1);
  int ln = unique(b + 1, b + 1 + n) - b - 1;
  for (int i = 1; i <= n; ++i)
    a[i] = lower_bound(b + 1, b + ln + 1, a[i]) - b;
  for (int i = 1; i <= m; ++i) {
    rd(qu[i].l); rd(qu[i].r); qu[i].id = i;
  }
  sort(qu + 1, qu + m + 1);
  int l = len, r = len - 1;
  for (int i = 1; i <= m; ++i) {
    if (bel[qu[i].l] == bel[qu[i].r]) {
      Ans[qu[i].id] = query(qu[i].l, qu[i].r);
    } else {
      while (r < qu[i].r) add(++r);
      save(l);
      while (l > qu[i].l) add(--l);
      Ans[qu[i].id] = ans;
      if (bel[qu[i + 1].l] != bel[qu[i].l]) {
        memset(dcnt, 0, sizeof(dcnt));
        l = (bel[qu[i].l] + 1) * len; r = l - 1; ans = 0;
      }
      else roll_back(l);
    }
  }
  for (int i = 1; i <= m; ++i) {
    wt(Ans[i]); putchar('\n');
  }
  //
#ifdef LOCAL
  cerr << "Times: " << clock() - startTime << "ms" << endl;
#endif
  return 0;
}
2022/3/23 19:29
加载中...