传送门

Inversion

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 0    Accepted Submission(s): 0


Problem Description
Give an array A, the index starts from 1.

Now we want to know Bi=maxi∤jAj , i≥2.
 

Input
The first line of the input gives the number of test cases T; T test cases follow.

Each case begins with one line with one integer n : the size of array A.

Next one line contains n integers, separated by space, ith number is Ai.

Limits
T≤20
2≤n≤100000
1≤Ai≤1000000000
∑n≤700000
 

Output
For each test case output one line contains n-1 integers, separated by space, ith number is Bi+1.
 

Sample Input
2
4
1 2 3 4
4
1 4 2 3
 

Sample Output
3 4 3
2 4 4
 

Statistic | Submit | Clarifications | Back

题意:

数组Bi的值等于下标i不整除j的最大的数组A中的值,直接给个样例解释

以1 4 2 3为例 2不能被1 、3整除,A1=1<A3=2,所以B2的值为2;

思路:

用pair将下标与value的值关联起来,以value的值从大到小排序,进行整除比较,找到最大的那个下标不能被整除的值

可以使用多中数据结构,或map或vector或list等

pair的排序重定义函数如下:

bool judge(const pair<int,int> a,const pair<int,int> b)

{

return a.first>b.first;//从大到小排序

}

代码如下:

#include<iostream>
#include<list>
#include<vector>
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
const int maxn=100006;
typedef long long ll;
ll b[maxn]; bool judge(const pair<ll,ll> a,const pair<ll,ll>b)
{
return a.first>b.first;
} int main()
{
int t;
scanf("%d",&t);
ll a;
int n;
while(t--)
{
vector<pair<ll,ll> >vec;
memset(b,0,sizeof(b));
scanf("%d",&n);
for(ll i=1;i<=n;i++)
{
scanf("%lld",&a);
vec.push_back(make_pair(a,i)); }
sort(vec.begin(),vec.end(),judge);
for(ll j=2;j<=n;j++)
{
for(ll i=0;i<vec.size();i++)
{
if(vec[i].second%j!=0)
{
b[j]=vec[i].first;
break;
}
else continue;
}
}
for(ll i=2;i<n;i++)
printf("%lld ",b[i]);
printf("%lld\n",b[n]);
}
return 0;
}
05-26 05:44