多校6 HDU-6098 Inversion 水题以及神奇的代码操作

来源:互联网 发布:淘宝最诚信的邮票商家 编辑:程序博客网 时间:2024/05/18 15:51

原题链接:
HDU-6098

大意:给一个串,然后生成另一个串,生成规则是(i>=2):

Bi=maxijAj

限制没啥特殊的,nlogn算法

思路:
暴力瞎搞即可。
排序 从后往前找 找到就 break

#include <bits/stdc++.h>using namespace std;typedef long long ll;#define mem(s,t) memset(s,t,sizeof(s))#define D(v) cout<<#v<<" "<<v<<endl#define inf 0x3f3f3f3f//#define LOCALinline void read(int &x){    x=0;char p=getchar();    while(!(p<='9'&&p>='0'))p=getchar();    while(p<='9'&&p>='0')x*=10,x+=p-48,p=getchar();}const int MAXN=100000+10;int a[MAXN],id[MAXN];bool cmp(int x,int y){return a[x]>a[y];}int main() {#ifdef LOCAL    freopen("in.txt","r",stdin);    freopen("out.txt","w",stdout);#endif    int t;    read(t);    while(t--){        int n;        read(n);        for(int i=1;i<=n;i++){            read(a[i]);            id[i]=i;        }        //sort(id+1,id+n+1,[&](int x,int y){return a[x]>a[y];});        sort(id+1,id+n+1,cmp);        int f=1;        for(int i=2;i<=n;i++){            for(int j=1;j<=n;j++){                if(id[j]%i){                    if(f) printf("%d",a[id[j]]),f=0;                    else printf(" %d",a[id[j]]);                    break;                }            }        }        puts("");    }    return 0;}

从标程学到两个神奇的东西 一个是 C++11 特性。

sort(id+1,id+n+1,[&](int x,int y){return a[x]>a[y];});

还有一个是神奇的 printf
非行末输出空格,否则换行。学习一个。

printf("%d%c",f," \n"[i==n]);

[i==n] 本身是判断条件 其值为 0 或 1 刚好对应 ” \n” 的下标 映射到 %c 产生奇妙的效果