Codeforces Round #776 (Div. 3) D Twist the Permutation (模拟)

题意(太难懂了

给定一个1-n数字的排列,要求通过一系列操作恢复到1-n顺序。第i个操作就是将前i个元素旋转左移任意次,让第i个元素到i的位置,记录每个数到它的位置需要左旋多少次,再将前i个元素左旋这些次数,然后再操作下一次。
时间复杂度为0(n^2)
每个数到它的位置需要左旋的次数为ans[i] = b[i] % i, b[i]是i的位置
前i个元素左旋ans[i]次b[j] = (b[j] - ans[i] + i) % i

代码

#include <iostream>

using namespace std;

const int N = 2010;
int a[N], b[N], ans[N];

int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        int n;
        cin >> n;
        for(int i = 1; i <= n; i ++ )
        {
            cin >> a[i];
            b[a[i]] = i;    // 记录a[i]的位置
        }
        for(int i = n; i >= 1; i --)
        {
            ans[i] = b[i] % i;
            for(int j = 1; j <= i; j ++ )
            {
                b[j] = (b[j] - ans[i] + i) % i;
            }
        }
        for(int i = 1; i <= n; i ++ )
            printf("%d ", ans[i]);
        puts("");
    }
    return 0;
}
posted @ 2022-03-10 21:23  inss!w!  阅读(110)  评论(2编辑  收藏  举报