Codeforces Round #776 (Div. 3) D Twist the Permutation (模擬)
阿新 • • 發佈:2022-03-10
題意(太難懂了)
給定一個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; }