CF1741B Funny Permutation

更好的阅读体验

题链:cf lugou

奇异构造。

Description

构造一个 1 ~ n 的排列 p,使得 i[1,n] 满足存在邻居为 ai±1aii

Analysis

构造题。分类讨论。此处的构造方式仅为个人观点,亦有其他构造可能。

  1. n 为偶数:直接降序输出 n1,易证满足条件。

  2. n 为奇数:此情况略复杂,因为直接倒序输出会导致 an+12=n+12
    考虑在中间数处扭转。下面再分两类:

    1. n2 为奇数,此处以 7 为例,得 7,6,4,5,3,2,1,很容易发现在 4,5 的位置发生了局部扭转。故得应在第 n12n+12 处进行扭转。
    2. n2 为奇数,此处以 5 为例,得 5,4,1,2,3,很容易发现在 4,1 的位置发生了整体扭转。故得应在后半部分即第 n12n 个数倒序。

注意:通过枚举不难发现 n=3 时无解,记住特判。

Code

#include <stdio.h> inline void Solve() { int n; scanf("%d", &n); if (n == 3) {puts("-1"); return;} if (n & 1) { //1 if (n / 2 & 1) { //1-i for (int i = 1; i <= n / 2; ++i) printf("%d ", n - i + 1); printf("%d %d ", n - (n / 2 + 2) + 1, n - (n / 2 + 1) + 1); for (int i = n - (n / 2 + 2); i >= 1; --i) printf("%d ", i); putchar('\n'); } else { //1-ii for (int i = 1; i <= n / 2; ++i) printf("%d ", n - i + 1); for (int i = 1; i < n - n / 2 + 1; ++i) printf("%d ", i); putchar('\n'); } } else { //2 for (int i = n; i >= 1; --i) printf("%d ", i); putchar('\n'); } } int main(void) { int T; for (scanf("%d", &T); T--; ) Solve(); return 0; }

The end. Thanks.

(路过一点


__EOF__

本文作者Miracle Hydrogen
本文链接https://www.cnblogs.com/dry-ice/p/cf1741b.html
关于博主:可耐拽冰!
版权声明:转载请注明来源哟~ QAQ
声援博主:UP UP UP !!!
posted @   Dry_ice  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示