璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


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 由 温婕莺