CF1893A
EternityLove · · 题解
正着想操作不是很好想,考虑倒着想操作。
当你考虑操作的逆操作时,你会发现,相当于每次回退
那么你的问题转变为,
考虑什么时候不能进行逆操作,即当且仅当
此时可以考虑模拟整个过程,值得注意的是,我们每次操作不需要去移动数组,而只需要修改最后一个数的指针位置即可,比如当且最后一个数的指针在
由于
#include <bits/stdc++.h>
#define N 500010
#define ll long long
#define endl '\n'
using namespace std;
inline ll read() {
char ch=getchar();ll ans=0,f=1;
for (;!isdigit(ch);ch=getchar()) if (ch=='-') f=-1;
for (;isdigit(ch);ch=getchar()) ans=(ans<<3)+(ans<<1)+ch-'0';
return ans*f;
}
int a[N],flag[N];
void slv() {
int n,k;
cin>>n>>k;
for (int i = 0;i < n;++ i) cin>>a[i],flag[i]=0;
int now=n-1;
while (k && !flag[now]) {
flag[now]=1;
if (a[now]>n) {
cout<<"No"<<endl;
return;
}
now=(now-a[now]+n)%n;
--k;
}
cout<<"Yes"<<endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
cin>>T;
while (T--) {
slv();
}
return 0;
}