C. Cat, Fox and Double Maximum

Problem - 1973C - Codeforces 

排列(Permutation)较常出现;对排列的性质和 trick 需要积累;

Problem - 1928B - Codeforces  这道B对本题有较好启发:对于任意排列,再加上一个与一个相同大小的排列合并,可以将所有数变为 n+1;

故仅需:

对奇(偶)数项上从小到大的数依次加上 n,n-1,…… n/2+1;

对偶(奇)数项上从小到大的数依次加上 n/2,n/2-1,……  1;

保证一排不小于 n+1,一排不大于 n 即可;

#include <bits/stdc++.h>
using namespace std;
const int max_n=4e5+5;
int n,x,flag;
struct node{int v,pos;};
vector<node>v;
vector<node>v2;
vector<node>ans;
bool cmp(const node x,const node y){return x.v<y.v;}
bool cmp2(const node x,const node y){return x.pos<y.pos;}
void solve()
{
    cin>>n;

    for(int i=1;i<=n;i++){
        cin>>x;if(x==1)flag=i;
        if(i&1){
            v.push_back((node){x,i});
        }else{
            v2.push_back((node){x,i});
        }
    }

    sort(v.begin(),v.end(),cmp);
    sort(v2.begin(),v2.end(),cmp);

    int mx=n,mn=n/2;
    if(flag&1)swap(mx,mn);
    for(int i=0;i<(int)v.size();i++){
        ans.push_back((node){mx,v[i].pos});
        ans.push_back((node){mn,v2[i].pos});
        mx--,mn--; 
    }

    sort(ans.begin(),ans.end(),cmp2);
    
    for(auto ai:ans)cout<<ai.v<<" ";
    cout<<endl;

    v.clear();v2.clear();ans.clear();
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int _t;cin>>_t;
    while(_t--){
        solve();
    }

    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值