七海ノ心象素描

所有的为时已晚都是恰逢其时

Nanami^2 avatar

Author

Nanami^2

大一学生 | 不是很聪明的样子

Telegram

我的频道

不定期推送灵感笔记

t.me/kisanami_blog
联系方式
QQ 群
1072614878
发送邮件

CF482A Diverse Permutation 题解

Solution

Nanami^2
Nanami^2 Even in the rain.
2022年06月30日
预计阅读 2 分钟
345 字

分析

话说这题为啥要写题解啊?

因为,我最最最最不擅长的构造题,我最最最最期望的「构造作战」,还是要从水题开始攻克吧。

如何构造 kk 种差值呢?

[1,k+1,2,k,3,k1][1,k+1,2,k,3,k-1 \cdots]

这样构造的差值是 k,k1,k2k,k-1,k-2 \cdots,那么就可以用 k+1k+1 个数字构造出 [1,k][1,k] 中所有的差值。

照这样,维护两个指针 i=1i=1j=k+1j=k+1,这样就确定了一个差值。然后让 i+1i+1j1j-1,又确定一个差值,知道 iji \ge j。如果这样操作之后出现了 i=ji=j 的情况,那么就说明 k+1k+1 是个奇数,进而 kk 是偶数。由于一轮确定 2 个数,假设进行了 tt 轮,那么就有了 2t2t 个数确定了 2t12t-1 个差值,这显然是个奇数。所以还要再补上一个 ii

那么后面的怎么搞呢?我们只用到了 [1,k+1][1,k+1] 的数,且一定全部用完并包含 1 这个差值。那么只要顺序输出 [k+2,n][k+2,n] 所有的数就能满足条件。

CODE

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n, k, ans[N];
int main() {
scanf("%d%d",&n,&k);
int i=1, j=i+k;
while(1) {
printf("%d %d ",i++,j--);
if(i>=j) {
if(i==j) printf("%d ",i);
break;
}
}
for(int i=k+2;i<=n;++i) printf("%d%c",i," \n"[i==n]);
}

觉得这篇文章怎么样?

点个赞,让更多人看到!

分享这篇文章

知识因分享而增值

分类

题解

标签

构造

版权声明:本文作者为 Nanami^2,首发于nanami7.top

遵循 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

评论区

本评论区由 EveSunMaple 自主开发