第28次周赛
A题:在匹配串里面寻找模板串
在枚举的时候是正常的序列暴力枚举思路
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
for(int k=j+1;k<=n;k++)
B题: 筛倍数
数组范围为值域范围
首个循环枚举约数
二重循环将他的所有倍数的个数加到他自己身上
for(int d=2;d<N;d++)
for(int i=2*d;i<N;i+=d)
cnt[d]+=cnt[i];
C题:并查集
对于连通性的思考,对于可以任意交换的元素,具有传递性
集合如何判等?存在vector中,排序判等
cin>>n;
for(int i=1;i<=n;i++) p[i]=i;
for(int i=1;i<=n;i++) cin>>arr[i];
for(int i=1;i<=n;i++) cin>>d[i];
for(int i=1;i<=n;i++)
{
merge(i-d[i],i);
merge(i,i+d[i]);
}
for(int i=1;i<=n;i++)
{
A[find(i)].push_back(i);
B[find(i)].push_back(arr[i]);
}
for(int i=1;i<=n;i++)
{
if(p[i]==i)
{
sort(A[i].begin(),A[i].end());
sort(B[i].begin(),B[i].end());
if(A[i]!=B[i])
{
puts("NO");
return 0;
}
}
}
puts("YES");