void HuanF() { int n; cin >> n; vector<int> p(n), q(n); for (auto &x: p) cin >> x; for (auto &x: q) cin >> x; vector<int> cp(p); std::map<int, int> pos; for (int i = 0; i < n; ++i) pos[q[i]] = i + 1; for (auto &x: p) x = pos[x]; BIT dp(n); vector<int> suf(n + 1); for (int i = n; i > 0; --i) { suf[i] = dp.get(n + 1 - p[i - 1]) + 1; dp.set(n + 1 - p[i - 1], suf[i]); } std::map<int, vector<PII> > bucket; for (int i = 0; i < n; ++i) { bucket[suf[i + 1]].emplace_back(cp[i], i); } vector<int> ans; ans.reserve(bucket.rbegin()->first); int idx = -1, qpos = -1; for (auto &[x,y]: bucket | std::views::reverse) { std::ranges::sort(y, std::greater<>()); for (auto &[f,s]: y) { if (s > idx && pos[f] > qpos) { idx = s; qpos = pos[f]; ans.emplace_back(f); break; } } } for (auto &x: ans) cout << x << " "; }
点赞 2

相关推荐

牛客网
牛客网在线编程
牛客网题解
牛客企业服务