题解:P12352 「HCOI-R2」Rabbit Panic (Easy Ver.)

· · 题解

Upd:改了一些胡言乱语的部分,比如倒闭了。

整场最简单的。

注意到最后剩下的一定是整个数列的平均值。

由于是一个排列,所以要得到这个值最简单的一个方法是让第 i 大值和第 i 小值取平均。

于是我们把第 i 大值和第 i 小值两两分组,在选中过程中整组整组的选即可。

但是当 m 是奇数时注意到会多出一位,此时选择的只能是数列的平均值,否则值会取错。然而如果数列平均值为小数不在序列中,那就无解。

还有就是反复选中显然不会有什么影响,本题不需要最小化步数,所以怎么构造都是对的。

还有一种无解的情况是 m=1,判掉即可。

代码易于实现。

#include<bits/stdc++.h>
using namespace std;
void solve(){
    int n,m;
    cin>>n>>m;
    if(n==1){
        puts("0");
        return;
    }
    if(m==1){
        puts("-1");
        return;
    }
    if(!(n&1)&&(m&1)){
        puts("-1");
        return;
    }
    int flc=(n-m)/2+1;
    cout<<flc<<'\n';
    for(int i=1;i<=flc;i++){
        if(m&1)cout<<n/2+1<<' ';
        for(int j=2;j<=m;j+=2)
            cout<<j/2+i-1<<' '<<n+1-(j/2+i-1)<<' ';
        puts("");
    }
}
signed main(){
    int t;
    cin>>t;
    while(t--)
        solve();
    return 0;
}