前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CF--思维练习--CodeForces - 220C Little Elephant and Shifts (STL模拟)

CF--思维练习--CodeForces - 220C Little Elephant and Shifts (STL模拟)

作者头像
风骨散人Chiam
发布2020-10-28 10:06:50
5270
发布2020-10-28 10:06:50
举报
文章被收录于专栏:CSDN旧文

ACM思维题训练集合 The Little Elephant has two permutations a and b of length n, consisting of numbers from 1 to n, inclusive. Let’s denote the i-th (1 ≤ i ≤ n) element of the permutation a as ai, the j-th (1 ≤ j ≤ n) element of the permutation b — as bj.

The distance between permutations a and b is the minimum absolute value of the difference between the positions of the occurrences of some number in a and in b. More formally, it’s such minimum |i - j|, that ai = bj.

A cyclic shift number i (1 ≤ i ≤ n) of permutation b consisting from n elements is a permutation bibi + 1… bnb1b2… bi - 1. Overall a permutation has n cyclic shifts.

The Little Elephant wonders, for all cyclic shifts of permutation b, what is the distance between the cyclic shift and permutation a?

Input The first line contains a single integer n (1 ≤ n ≤ 105) — the size of the permutations. The second line contains permutation a as n distinct numbers from 1 to n, inclusive. The numbers are separated with single spaces. The third line contains permutation b in the same format.

Output In n lines print n integers — the answers for cyclic shifts. Print the answers to the shifts in the order of the shifts’ numeration in permutation b, that is, first for the 1-st cyclic shift, then for the 2-nd, and so on.

Examples Input 2 1 2 2 1 Output 1 0 Input 4 2 1 3 4 3 4 2 1 Output 2 1 0 1 这个题预处理一下初始的dis,然后用mutiset模拟即可

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int a[maxn],b[maxn];
multiset<int> ms;
int main()
{
    int n, x;
    scanf("%d", &n);
    for (int i = 0; i < n; ++i)
    {
        scanf("%d", &x);
        a[x] = i;
    }
    for (int i = 0; i < n; ++i)
    {
        scanf("%d", &b[i]);
        ms.insert(i - a[b[i]]);
    }
    for (int i = 0; i < n; ++i)
    {
        auto po = ms.lower_bound(i);
        int ans = 0X3F3F3F3F;
        if (po != ms.end())
            ans = min(ans, *po - i);
        else if (po != ms.begin())
            ans = min(ans, i - *(--po));
        printf("%d\n", ans);
        po = ms.find(i - a[b[i]]);
        ms.erase(po);
        ms.insert(i - a[b[i]] + n);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/02/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档