1 条题解
-
0
区间不同元素个数(D-query) 题解
思路分析
按题目要求使用对应数据结构与算法模拟/递推求解,注意数据范围边界与时间复杂度。
参考代码
#include <iostream> #include <vector> #include <algorithm> using namespace std; struct Query { int l, r, id; bool operator<(const Query& o) const { return r < o.r; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; if (!(cin >> n)) return 0; vector<int> a(n + 1); for (int i = 1; i <= n; ++i) cin >> a[i]; int q; cin >> q; vector<Query> qs(q); for (int i = 0; i < q; ++i) { cin >> qs[i].l >> qs[i].r; qs[i].id = i; } sort(qs.begin(), qs.end()); vector<int> bit(n + 1, 0), lastPos(1000005, 0), ans(q); auto add = [&](int idx, int v) { for (int i = idx; i <= n; i += i & -i) bit[i] += v; }; auto query = [&](int idx) { int s = 0; for (int i = idx; i > 0; i -= i & -i) s += bit[i]; return s; }; int curR = 0; for (const auto& qu : qs) { while (curR < qu.r) { ++curR; int v = a[curR]; if (lastPos[v]) add(lastPos[v], -1); lastPos[v] = curR; add(curR, 1); } ans[qu.id] = query(qu.r) - query(qu.l - 1); } for (int i = 0; i < q; ++i) cout << ans[i] << "\n"; return 0; }
- 1
信息
- ID
- 8670
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者