F - Permutation Distance(去绝对值&数据结构)[AtCoder Beginner Contest 283]

题目如下:

在这里插入图片描述
题目链接

题解 or 思路:

在这里插入图片描述
去掉绝对值后 有 2 × 2 = 4 2 \times 2 = 4 2×2=4 中情况
虚线括起来的是需要维护的,其他直接枚举就行!

对于 p i < p j p_i < p_j pi<pj 的情况,设我们维护的式子为 x x x
那我们每次枚举查找的范围为 [ s [ i ] , n ] [s[i], n] [s[i],n]
为了简便代码的书写,我们可以插入的时候 s [ i ] s[i] s[i] 变成 n − s [ i ] + 1 n - s[i] + 1 ns[i]+1,那么查找就变成 [ 1 , n − s [ i ] + 1 ] [1,n - s[i] + 1] [1,ns[i]+1]

可以结合下面代码进行理解

AC 代码如下:

#define int long long
const int N = 200009;
const int inf = 2147483647;
int n, s[N], res[N];
int lowbit(int x)
{
    return x & -x;
}
struct nn
{
    int tree[N];
    void update(int x, int d)
    {
        for (int i = x; i <= n; i += lowbit(i))
            tree[i] = min(tree[i], d);
    }
    int query(int x)
    {
        int ans = inf;
        for (int i = x; i; i -= lowbit(i))
            ans = min(ans, tree[i]);
        return ans;
    }
} lan[2];

void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> s[i];
    fill(lan[0].tree + 1, lan[0].tree + n + 1, inf);
    fill(lan[1].tree + 1, lan[1].tree + n + 1, inf);
    for (int i = 1; i <= n; i++)
    {
        res[i] = min(s[i] + i + lan[0].query(s[i]), i - s[i] + lan[1].query(n - s[i] + 1));
        lan[0].update(s[i], -s[i] - i);
        lan[1].update(n - s[i] + 1, s[i] - i);
    }
    fill(lan[0].tree + 1, lan[0].tree + n + 1, inf);
    fill(lan[1].tree + 1, lan[1].tree + n + 1, inf);
    for (int i = n; i >= 1; i--)
    {
        res[i] = min({res[i], s[i] - i + lan[0].query(s[i]), -s[i] - i + lan[1].query(n - s[i] + 1)});
        lan[0].update(s[i], i - s[i]);
        lan[1].update(n - s[i] + 1, s[i] + i);
    }
    for (int i = 1; i <= n; i++)
        cout << res[i] << " \n"[i == n];
}
signed main()
{
    buff;
    solve();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Joanh_Lan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值