首页 > 其他分享 >abc283 F - Permutation Distance

abc283 F - Permutation Distance

时间:2023-01-03 10:44:23浏览次数:34  
标签:Distance min int void Permutation tr ans INF abc283

题意:

给定 \(1\sim n\) 的排列 \(P\),对每个 \(i\in [1,n]\),计算 \(\min\limits _{j\neq i}\{ |P_i-P_j|+|i-j| \}\)

\(n\le 2e5\)

思路:

我超,俩绝对值怎么办?硬拆就完事了!

\[i>j,Pi>Pj\implies i+Pi+min\{-j-Pj\}\\ i>j,Pi<Pj\implies i-Pi+min\{-j+Pj\}\\ i<j,Pi>Pj\implies -i+Pi+min\{j-Pj\}\\ i<j,Pi<Pj\implies -i-Pi+min\{j+Pj\} \]

经典二位偏序,树状数组或者线段树维护最值,做四次

const signed N = 2e5 + 5, INF = 1e9;
int n, a[N], ans[N];

int tr[N * 4];
void init() {
    fill(tr, tr + N * 4, INF);
}
void modify(int u, int l, int r, int p, int x) { //单点修改
    if(l == r) return tr[u] = x, void();
    int mid = (l + r) / 2;
    if(p <= mid) modify(u * 2, l, mid, p, x);
    else modify(u * 2 + 1, mid + 1, r, p, x);
    tr[u] = min(tr[u * 2], tr[u * 2 + 1]);
}
int ask(int u, int l, int r, int x, int y) {
    if(x > y) return INF;
    if(x <= l && r <= y) return tr[u];
    int mid = (l + r) / 2, s = INF;
    if(x <= mid) s = min(s, ask(u * 2, l, mid, x, y));
    if(y > mid) s = min(s, ask(u * 2 + 1, mid + 1, r, x, y));
    return s;
}

void sol() {
    cin >> n;
    for(int i = 1; i <= n; i++)
        cin >> a[i];
    
    fill(ans, ans + N, INF);
    
    init(); for(int i = 1; i <= n; i++) {
        ans[i] = min(ans[i], i + a[i] + ask(1, 1, n, 1, a[i] - 1));
        modify(1, 1, n, a[i], -i - a[i]);
    }
    init(); for(int i = 1; i <= n; i++) {
        ans[i] = min(ans[i], i - a[i] + ask(1, 1, n, a[i] + 1, n));
        modify(1, 1, n, a[i], -i + a[i]);
    }
    init(); for(int i = n; i >= 1; i--) {
        ans[i] = min(ans[i], -i + a[i] + ask(1, 1, n, 1, a[i] - 1));
        modify(1, 1, n, a[i], i - a[i]);
    }
    init(); for(int i = n; i >= 1; i--) {
        ans[i] = min(ans[i], -i - a[i] + ask(1, 1, n, a[i] + 1, n));
        modify(1, 1, n, a[i], i + a[i]);
    }
    
    for(int i = 1; i <= n; i++)
        cout << ans[i] << ' ';
}

标签:Distance,min,int,void,Permutation,tr,ans,INF,abc283
From: https://www.cnblogs.com/wushansinger/p/17021389.html

相关文章

  • ABC 283 F - Permutation Distance(推公式,维护二维偏序)
    F-PermutationDistance题意​ 给出一个排列P。求序列D,\(D_i\)的定义如下。\[D_{i}=\min_{j\neqi}\left\{\left|P_{i}-P_{j}\right|+|i-j|\right\}\]思路​ 在......
  • 【CF1672I】PermutationForces(线段树)
    记\(c_i=|i-p_i|\)。可以证明,删掉一个\(c_i\leqs\)的点后,只会让\(c_j>s\)的点的\(c_j\)变小,且原本\(c_j\leqs\)的点的\(c_j\)仍不会大过\(s\)。也就是说我们......
  • sortedArrDistanceLessK() 已知一个几乎有序的数组。几乎有序是指,如果把数组排好顺序
    packageclass06;importjava.util.Arrays;importjava.util.PriorityQueue;/***sortedArrDistanceLessK()*已知一个几乎有序的数组。几乎有序是指,如果把数组......
  • 题解 CF1770B【Koxia and Permutation】
    \(k=1\)的情况是平凡的。\(k>1\)的情况,显然答案至少为\(n+1\),下面给出构造证明\(n+1\)总可以取到。可以构造\(p=[n,1,n-1,2,n-2,3,\cdots]\),此时以\(n\)作为最......
  • AtCoder-abc230_g GCD Permutation 容斥
    J-GCDPermutation传送门:J-GCDPermutation知识点:素数筛、容斥定理、gcd题意:长度为n的一个排列a中,求满足\(gcd(i,j)!=1且gcd(a_i,a_j)!=1\)的i,j对数。i,j可以......
  • 【题解】ABC283
    \(\text{AtCoderBeginnerContest283}\)APower无意义题,直接输出。BFirstQueryProblem无意义题,维护一个支持单点修改、单点查询的数据结构。(雾)CCashRegister......
  • CF213E Two Permutations
    好久没有交流题目了啊,回来补一下之前的哈。题目要使 $a_1+x$,$a_2+x$,$\cdots$,$a_n+x$是$b$序列的子序列。这里最烦的部分应该就是子序列是不连续的。注意到$a$序列......
  • Resistance distance 图上2个节点的等效电阻求解算法
    目录​​如何计算正方体网络中(乃至更一般的图)2个节点间的等效电阻?公式的正确性很容易得到验证​​​如何计算Weightedmatrix的Resistancematrix我验证了特例,是对的,......
  • next_permutation
    next_permutation个人感觉这个函数是值得学习一下的,全排列专用,用于将当前数组换到下一个排列举个栗子:b[]=12345next_pertutation(b,b+5)b[]=12354高效......
  • 「CF1718D」Permutation for Burenka
    题目点这里看题目。称一个数组是纯的,当且仅当其中不存在重复元素。对于两个长度均为\(n\)的纯数组\(a,b\),称它们是相似的,当且仅当:\[\forall1\lel\ler\len,\arg......