C. Alya and Permutation(python解)-codeforces

C. Alya and Permutation(python解)

原题链接:

Problem - C - Codeforces

问题分析:

​ 给定一个整数 n,我们需要构造一个包含 1,2,…,n的排列 p,通过特定的运算使得一个初始值为 0 的变量 k 达到最大。

对于于每一个 i 从 1 到 n

​ 如果 i 是奇数,则执行:

​ k = k & p**i

​ 如果 ii 是偶数,则执行:

​ k = k | p**i

​ 我们的目标是找到一个排列 p,使得运算结束时 k 的值尽可能大

思路:

​ 在这个问题中,我们可以通过合理设置最后 5 个元素来控制 k 的值。我们可以将问题分成两种情况处理:n 为奇数和偶数。

代码:

def main():  
    import sys  
    input = sys.stdin.read  
    data = input().split()  
    t = int(data[0])  
    index = 1  
    results = []  
    for _ in range(t):  
        n = int(data[index])  
        index += 1  
        s = set(range(1, n + 1))  
        a = [0] * (n + 1)  
        
        po2 = 1  
        while po2 * 2 <= n:  
            po2 *= 2  
            
        if n % 2 == 1:  
            results.append(n)  
            low = n & (-n)  
            a[n - 3] = low  
            a[n - 2] = low + (2 if low == 1 else 1)  
            a[n - 1] = n - low  
            a[n] = n  
        else:  
            results.append(po2 * 2 - 1)  
            if n == po2:  
                a[n - 4] = 1  
                a[n - 3] = 3  
                a[n - 2] = n - 2  
                a[n - 1] = n - 1  
                a[n] = n  
            else:  
                a[n - 2] = n  
                a[n - 1] = n - 1  
                a[n] = po2 - 1  
        
        for i in range(1, n + 1):  
            if a[i] in s:  
                s.remove(a[i])  
        
        for i in range(1, n + 1):  
            if a[i] == 0:  
                a[i] = s.pop()  
        results.append(' '.join(map(str, a[1:])))  
    print('\n'.join(map(str, results)))  
main()
posted @ 2024-11-02 15:06  MPyGF  阅读(22)  评论(0编辑  收藏  举报