2017杭电多校第六场03Inversion

传送门


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=maxijAj , i2.
 

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
T20
2n100000
1Ai1000000000
n700000
 

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
",b[n]);
    }
    return 0;
}




原文地址:https://www.cnblogs.com/bryce1010/p/9387435.html