icpc:problems:usaco23open_rotate_and_shift_b
problems | |
---|---|
名称 | Rotate and Shift B |
题目编号 | USACO23OPEN_B3 |
题目链接 | luogu.com.cn/… |
来源 | USACO |
算法分类 | 思维, 数学 |
难易程度 | 一般般 |
Rotate and Shift B
想法
由于题目规定的循环方式与A数组特殊的更新方式,可以发现,在初始状态中,原先在$ A_i \to A_{i+1} $ 的数,在更新过程中依旧在该区间中,故本题在更新中存在周期。
在更新的过程中每段区间的更新周期与该区间的长度有关,在计算T次操作后的位置时,首先需要减去区间左端到该点的次数,再利用周期进行计算,每次区间内的点在向前更新时移动区间长度的距离。
代码实现
#include<cstdio> const int N = 1e5 * 2 + 10; int A[N], line[N]; int main() { int n, k, t; scanf("%d %d %d", &n, &k, &t); for (int i = 0; i < k; ++i) scanf("%d", &A[i]); A[k] = n; int mode = 0; for (int i = 0; i < n; ++i) { if(i >= A[mode+1]) mode++; int temp = t - (i - A[mode] + 1), end; if(temp >= 0) { temp = 1 + temp / (A[mode+1] - A[mode]); end = (i + temp * (A[mode+1] - A[mode])) % n; } else end = i; line[end] = i; } for (int i = 0; i < n; ++i) printf("%d ", line[i]); return 0; }
/app/www/public/data/pages/icpc/problems/usaco23open_rotate_and_shift_b.txt · 最后更改: 2023/06/13 03:15 由 温婕莺