社区讨论
本题该复杂度是否可过?
AT_joisc2014_c歴史の研究参与者 6已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @m37a4hfo
- 此快照首次捕获于
- 2024/11/07 20:23 去年
- 此快照最后确认于
- 2025/11/04 15:10 4 个月前
,普通莫队 + set 维护最大值。
TLE。
CPP#include <bits/stdc++.h>
#define _for(i, a, b) for (int i = (a); i <= (b); i ++ )
#define ll long long
using namespace std;
const int N = 1e5 + 5;
int n, m, q, B, a[N], b[N], cnt[N], bel[N]; ll ans[N]; int add_cnt, del_cnt;
struct Query { int l, r, id; } qry[N];
struct Event {
int id; ll w;
inline bool operator < (const Event & t) const { return w > t.w; }
};
set<Event> s; set<Event> :: iterator it;
inline void add(int x) {
it = s.find((Event){x, 1ll * cnt[x] * b[x]}), cnt[x] ++ ;
if (it != s.end()) s.erase(it);
s.insert((Event){x, 1ll * cnt[x] * b[x]});
}
inline void del(int x) {
it = s.find((Event){x, 1ll * cnt[x] * b[x]}), cnt[x] -- ;
if (it != s.end()) s.erase(it);
s.insert((Event){x, 1ll * cnt[x] * b[x]});
}
int main() {
ios :: sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> q, B = sqrt(n); int l = 1, r = 0, L, R, id;
_for (i, 1, n) cin >> a[i], b[i] = a[i], bel[i] = (i - 1) / B + 1;
sort(b + 1, b + n + 1), m = unique(b + 1, b + n + 1) - b - 1;
_for (i, 1, n) a[i] = lower_bound(b + 1, b + m + 1, a[i]) - b;
_for (i, 1, q) cin >> qry[i].l >> qry[i].r, qry[i].id = i;
sort(qry + 1, qry + q + 1, [&] (Query u, Query v) { return bel[u.l] ^ bel[v.l] ? bel[u.l] < bel[v.l] : (bel[u.l] & 1 ? u.r > v.r : u.r < v.r); });
_for (i, 1, q) {
L = qry[i].l, R = qry[i].r, id = qry[i].id;
while (l > L) add(a[ -- l]), add_cnt ++ ;
while (r < R) add(a[ ++ r]), add_cnt ++ ;
while (l < L) del(a[l ++ ]), del_cnt ++ ;
while (r > R) del(a[r -- ]), del_cnt ++ ;
ans[id] = ( * s.begin()).w;
}
cerr << add_cnt << " " << del_cnt << "\n";
_for (i, 1, q) cout << ans[i] << "\n";
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...