P12557 !?球球?!
为叙述方便,后文下标使用 0-base。如果一个点在传球若干次之后能到达,则称其是可达的。
设
注意到不超过
对于一个因数
接下来开始处理查询。可以维护
时间复杂度
附上 AC Code。
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=3e5+10;
int n,q,a[N],num[N],tot,pos[N],lst[N],ans[N];
vector<int> vec[N];
signed main(){
cin>>n>>q;
memset(ans,0x3f,sizeof ans);
for(int i=0;i<n;i++)cin>>a[i];
for(int i=1;i*i<=n;i++){
if(n%i==0){
num[++tot]=i;
if(i*i!=n)num[++tot]=n/i;
}
}
sort(num+1,num+tot+1);
for(int i=1;i<=tot;i++){//预处理最小值
lst[num[i]]=-1;
for(int j=0;j<num[i];j++){
int curmn=1e9;
for(int k=j;k<n;k+=num[i])curmn=min(curmn,a[k]);
vec[num[i]].push_back(curmn);
}
}
for(int i=1,x;i<=q;i++){
cin>>x;pos[i]=(pos[i-1]+x)%n;
int gc=__gcd(pos[i],n);
for(int j=lst[gc]+1;j<=i;j++){//添加贡献
ans[gc]=min(ans[gc],vec[gc][pos[j]%gc]);
}
lst[gc]=i;
cout<<ans[gc]<<" ";
}
return 0;
}