关于此题Codeforces Global Round 27_C. Alya and Permutation神仙构造题

//首先让a[i] = i,如果把a[1]和a[2]调换,发现到奇数位置时就会是它本身,于是n为奇数的情况直接出来了
//而如果n为偶数,例如10,我们直接让111放在最后或,只要保证前面几个数全都有最高位的1,那么最后的答案肯定是最大的。
//但是n为偶数出现了特殊情况,例如8,此时如果还把111放在最后,我们没法保证前面最高位的1不会被吞掉,但是根据第一条性质,由于2的i次方前一个数就已经是除最高位外全都为1的了,而最后一个操作又是或,所以构造方式跟第一种情况一样
#include<bits/stdc++.h>
    
using namespace std;
    
long long t;
const long long N = 2e5 + 10;
long long n;
    
void solve() {
    cin >> n;
    long long res = 0;
    vector<long long> a(n + 1);
    a[1] = 2,a[2] = 1;
    if(n & 1) {
        cout << n << '\n';
        cout << a[1] << ' ' << a[2] << ' ';
        for(long long i = 3;i <= n;i++) cout << i << ' ';
        cout << '\n';
    }
    else {
        long long ans = (1ll << (64 - __builtin_clzll(n))) - 1;
        cout << ans << '\n';
        if(n == (n & (-n))) {
            cout << a[1] << ' ' << a[2] << ' ';
            for(long long i = 3;i <= n;i++) cout << i << ' ';
            cout << '\n';
        }
        else {
            long long tmp = (1ll << (63 - __builtin_clzll(n))) - 1;
            a[n] = tmp;
            long long r = n;
            for(long long i = n;i > tmp;i--) a[--r] = i;
            for(long long i = 3;i < tmp;i++) a[i] = i;
            for(long long i = 1;i <= n;i++) cout << a[i] << ' ';
            cout << '\n';
        }
    }   
}
    
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin >> t;
    while(t--) solve();
    
    return 0;
}
posted @ 2025-03-20 21:07  孤枕  阅读(16)  评论(0)    收藏  举报