就是维护一下每个值现在取到几。复杂度调和级数求和nlogn
#include <bits/stdc++.h>
using namespace std;
#define N 1100000
#define ll long long
int n,m,mx,top;
int a[N],pos[N];
ll now,bel[N],st[N];
int main()
{
//freopen("tt.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),mx=max(mx,a[i]);
scanf("%d",&m);
for(int x;m--;)
{
scanf("%d",&x);
for(int i=pos[x]+x,cnt=0;cnt<x&&i<=mx;i+=x)
if(!bel[pos[x]=i])
{
bel[i]=now+cnt+1;
cnt++;
}
now+=x;
}
for(int i=1;i<=n;i++)
if(bel[a[i]])
st[++top]=bel[a[i]];
printf("%d\n",top);
sort(st+1,st+1+top);
for(int i=1;i<=top;i++)
printf("%lld\n",st[i]);
return 0;
}
本文介绍了一个使用C++实现的算法,该算法通过维护一系列数值的状态来解决问题,整体复杂度为NlogN。文章通过具体代码展示了如何通过调和级数求和的方式处理输入数据,并对每个步骤进行了详细的解释。
751

被折叠的 条评论
为什么被折叠?



