Codeforces Round #639 (Div. 2)
题目大意
有一个数组,对于任何数字k在数轴上的位置对n取模后都会映射与这个数组的某一个位置index,对于每一个位置都会有一个移动操作,问当k-》无限的时候,是否依然是每个位置都有且仅有一个数。
做法分析
这个题我的思路是把数轴想象成给定的这个数组无限相邻的一个轴。那么对于任意一个数组段的某个位置上出现了2个访客或是0个访客显然都是不成立的。为了表述这个无穷的概念。
可以把所有位置的下标均%n。这样就把整个数轴的情况映射到了单一的区间。也只需要对单一区间操作即可。详细的注释在代码里面有体现。
代码
#include<bits/stdc++.h> using namespace std ; long long a[200005]; long long b[200005]; int main(){ int t; cin>>t; while(t--){ int n; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; //输入数组 b[i]=0; //初始化 } for(int i=0;i<n;i++){ int temp=(i+a[i])%n; //找到映射于i的数字将要移动到的位置并对其取模映射到单一区间。 if(temp<0)temp+=n; b[temp]++; //记录这个映射位置被到达过的数量。 } int flag=0; for(int i=0;i<n;i++){ if(b[i]==0||b[i]>1){ //到达过两次以上或是没到达过就说明不符合要求。 cout<<"NO"<<endl; flag=1; break; } } if(!flag)cout<<"YES"<<endl; } }