Codeforces Round #639 (Div. 2).C. Hilbert's Hotel

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;
    }
}
rush!
原文地址:https://www.cnblogs.com/LH2000/p/12841040.html