桶 贪心 B. Swaps Codeforces Round #743 (Div. 2)

图片说明

  1. 对于每个a[i] 找第一个大于它的b[j]
  2. 用桶找
  3. 亦可线段树
#include <bits/stdc++.h>
#define sc(x) scanf("%lld", &(x))
#define pr(x) printf("%lld\n", (x))
#define rep(i, l, r) for (int i = l; i <= r; ++i)
using namespace std;
typedef long long ll;
const int N = 2e5 + 7;
const int mod = 1e9 + 7;
signed main() {
    int T;
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    cin >> T;
    while (T--) {
        int n;
        cin >> n;
        unordered_map<int, int> p, q;
        for (int i = 0, x; i < n; ++i) cin >> x, p[x] = i;
        for (int i = 0, x; i < n; ++i) cin >> x, q[x] = i;
        // 对于每个a[i] 第一个大于它的b[j]
        vector<int> f(n, n);
        int last = n;
        for (int i = n * 2; i; i -= 2) {
            int &ori = f[p[i - 1]];
            int &pos = q[i];
            ori = min(ori, pos);
            ori = min(ori, last);
            last = ori;
        }
        // 统计答案
        int ans = n * 2;
        for (int i = 0; i < n; ++i) ans = min(ans, i + f[i]);
        cout << ans << '\n';
    }
    return 0;
}

如果题目没有限制数据范围,就需要sort+二分或者set二分确定最右小值是谁

算法竞赛之路 文章被收录于专栏

整理、记录算法竞赛的好题

全部评论

相关推荐

投票
我要狠拿offer:如果不是必须去成都绝对选九院呀,九院在四川top1研究所了吧
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务