2017多校赛6 Inversion hdu 6098

来源:互联网 发布:免费网络兼职 编辑:程序博客网 时间:2024/06/06 00:24

直达飞机

题目

题目意思:求B数组(B[0]除外), 每个B[i]是所有A[j](i不能整除j)中的最大值, 就是剔除下标是i的倍数的数啦。
思路:要什么就找什么的方式硬干是很难受的, 思路转一下。既然是求最大值, 那么就看最大值是谁的菜了不是?假设最大值下标为j, 则只要最大值下标j不是i的倍数,就可以确定B[i]=A[j]。详细内容见代码和注释

#include <cstring>#include <cstdio>#include <iostream>#include <string>#include <climits>#include <vector>#include <map>#include <algorithm>#include <cmath>#include <queue>using namespace std;typedef long long LL;#define MAXN_NUM 0x3f3f3f3f#define EPS 1e-6#define DGA(x)#define DFA(x)#define PRT(x,a) printf("%s%d%s\n",a,x,a)#define TEST(x)  printf("---------test %c---------\n",x+'A')#define Fin(i,f,t) for(int i=f;i<=t;++i)#define Fde(i,f,t) for(int i=f;i>=t;--i)#define SfI(x)  scanf("%d",&x)#define SfLL(x) scanf("%lld",&x)#define SfD(x)  scanf("%lf",&x)#define SfC(x)  scanf("%c",&x)#define SfS(x)  scanf("%s",x)#define MAXN 6struct node{    int v,p;//值和下标    node(){}    node(int v, int p):v(v), p(p){}    bool operator<(const node& a) const{        if(v!=a.v) return v<a.v;        return p<a.p;    }}nd;priority_queue<node> que;const int maxn=1e5+100;int ans[maxn];int main(void){    DFA(freopen("D:\\test.txt","r",stdin));    //freopen("D:\\tsst.txt","w",stdout);    int T, n;    for (scanf("%d", &T); T; T--){        scanf("%d", &n);        while (!que.empty()) que.pop();        for (int i=1; i<=n; i++){            scanf("%d", &nd.v);nd.p=i;            que.push(nd);        }        int num=0;//记录下得到结果的个数        for (int i=0; i<=n; i++) ans[i]=-1;//标记下,防止次优解覆盖最优解        while(!que.empty()){            nd=que.top(); que.pop();            for (int i=n; i>0; i--){                if (nd.p%i==0) continue;                if(ans[i]==-1){                    ans[i]=nd.v; num++;                }            }            if(num==n-1){                break;            }        }        for (int i=2; i<=n; i++){            if (i!=2)putchar(' ');            printf("%d", ans[i]);        }        putchar('\n');    }    return 0;}

很久没写了,这算比较水的题,找找存在感?权当如此吧。。

原创粉丝点击