http://acm.hdu.edu.cn/showproblem.php?pid=6098
题意:对于给定的a数组,求b数组。b数组的第i个是a数组中下标除i倍数以外的最大值。
题解:对a数组从大到小排序,并记录下标。然后对下标扫一遍,用筛法效率高一点。直接扫其实也不会超时1000ms左右,注意姿势就行。
代码:
#include<bits/stdc++.h>
#define debug cout<<"aaa"<<endl
#define mem(a,b) memset(a,b,sizeof(a))
#define LL long long
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define MIN_INT (-2147483647-1)
#define MAX_INT 2147483647
#define MAX_LL 9223372036854775807i64
#define MIN_LL (-9223372036854775807i64-1)
using namespace std;
const int N = 100000 + 5;
const int mod = 1000000000 + 7;
struct node{
int id,num;
}a[N];
bool cmp(node x,node y){
if(x.num>y.num){
return 1;
}
else{
return 0;
}
}
int ans[N];
int main(){
int t,n,cnt;
scanf("%d",&t);
while(t--){
cnt=0,mem(ans,0);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i].num);
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
for(int j=2;j<=n;j++){
if(a[i].id%j!=0&&!ans[j]){
for(int k=j;k<=n;k+=j){
if(!ans[k]){
ans[k]=a[i].num;
cnt++;
if(cnt==n-1){
break;
}
}
}
}
if(cnt==n-1){
break;
}
}
if(cnt==n-1){
break;
}
}
for(int i=2;i<n;i++){
printf("%d ",ans[i]);
}
printf("%d\n",ans[n]);
}
return 0;
}