1 条题解
-
0
自动搬运
来自洛谷,原作者为

win114514
过去的我正在消散,未来的我模糊不清,唯一能相信的只有现在的自己。搬运于
2025-08-24 22:59:05,当前版本为作者最后更新于2024-06-03 17:45:38,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
正式场上拿了这题的首 ,让队伍不至于无奖而返。
思路
容易发现题目的买入卖出过程形似一个括号匹配。
那么我们可以对每一种类型的物品做括号匹配。
若是一个匹配的括号在询问区间内则可以记入答案。
就变成了一个二维数点问题。
离线树状树组即可。
Code
#include <bits/stdc++.h> using namespace std; #define fro(i, x, y) for (int i = (x); i <= (y); i++) #define pre(i, x, y) for (int i = (x); i >= (y); i--) const int N = 5e5 + 10; int n, q, a[N], c[N], p[N], t[N], l[N], r[N], ans[N]; vector<int> d[N]; vector<int> o[N]; inline void upd(int x) { while (x) t[x]++, x -= (x & (-x)); } inline auto ask(int x) { int r = 0; while (x <= n) r += t[x], x += (x & (-x)); return r; } signed main() { ios::sync_with_stdio(0), cin.tie(0); cin >> n >> q; fro(i, 1, n) cin >> a[i]; fro(i, 1, n) cin >> c[i]; fro(i, 1, n) { if (a[i] == 0) d[c[i]].push_back(i); if (a[i] == 1) if (!d[c[i]].empty()) p[i] = d[c[i]].back(), d[c[i]].pop_back(); } fro(i, 1, q) cin >> l[i] >> r[i], o[r[i]].push_back(i); fro(i, 1, n) { if (p[i]) upd(p[i]); for (auto j : o[i]) { ans[j] = ask(l[j]); } } fro(i, 1, q) cout << ans[i] << "\n"; return 0; }
- 1
信息
- ID
- 10308
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者