• 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;
    }
    




  • 相关阅读:
    P4047 部落划分
    P1440 求m区间的最小值
    P2880 平衡的阵容
    P2700 逐个击破
    P2814 家谱 map模版
    P4403 秦腾与教学评估
    无油无糖低脂酸奶芒果蛋糕
    紫薯铜锣烧
    Spring In Action ③
    Spring In Action ②
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9387435.html
Copyright © 2020-2023  润新知