abc250_e Prefix Equality 题解
Prefix Equality
题意
给定长度为
对于每组询问,回答以下内容:
- 如果
的前 项数值构成的不重复集合与 的前 项相同,输出Yes
,否则输出No
。
数据范围
思路
两种做法:在线和离线,在线是莫队,不会。
可以发现,对于
那么就好办了,先预处理出每个
随着
复杂度
- 时间:
- 空间:
Code
点击查看代码
#include <iostream> #include <set> using namespace std; const int N = 2e5 + 10; struct ANS { int l, r; } ans[N]; int n, a[N], b[N], x, y, q; set<int> st, st2; // 用 set 维护 a 和 b 的前 i、j 项,刚好还能去个重 int main () { ios::sync_with_stdio(0), cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i <= n; i++) { cin >> b[i]; } for (int i = 1, j = 1; i <= n; i++) { if (st2.find(a[i]) != st2.end()) { // 当前处理的数已经出现过了,那么这个区间与上一个区间相同 ans[i] = ans[i - 1]; } else { st2.insert(a[i]); // 记录 for (; j <= n && st2.find(b[j]) != st2.end(); j++) { // 不断查找,直到有一个数没在 a 的前 i 项中出现过 st.insert(b[j]); // 记录,去重 if (st.size() == st2.size()) { // 两个大小相同了,说明这个时候可以统计答案区间 if (!ans[i].l) { // 更新区间 ans[i] = {j, j}; } else { ans[i].r = j; } } } } } for (cin >> q; q; q--) { cin >> x >> y; cout << (ans[x].l <= y && ans[x].r >= y ? "Yes\n" : "No\n"); // 回答询问 } return 0; }
本文作者:wnsyou の blog
本文链接:https://www.cnblogs.com/wnsyou-blog/p/17324113.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步