「Codeforces 359B」Permutation

观察

i=1na2i1a2ii=1na2i1a2i=2k \sum_{i=1}^n|a_{2i-1}-a_{2i}|-|\sum_{i=1}^na_{2i-1}-a_{2i}|=2k

发现一个绝对值在外,一个绝对值在里

a0,a+c0a+c=a+c+2a a\le 0, a+c\ge0\\ |a|+|c|=|a+c|+2|a|
a,c0a+c=a+c a,c\ge 0\\ |a|+|c|=|a+c|

类似的

a1a2+a3a4+=2k+a1a2+a3a4 |a_1-a_2|+|a_3-a_4|+\cdots=2k+|a_1-a_2+a_3-a_4\cdots|

只要令

a1a2=k i[2,n], a2i1a2i>0 a_1-a_2=-k\\ \forall\ i\in[2,n],\ a_{2i-1}-a_{2i}> 0

就可满足

例如 n=6,k=2n=6,k=2

1 3 12 11 10 9 8 7 6 5 4 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#define rep(i, l, r) for (int i = (l); i <= (r); ++i)
#define per(i, l, r) for (int i = (l); i >= (r); --i)
using std::cin;
using std::cout;
int main() {
#ifdef LOCAL
freopen("input", "r", stdin);
#endif
std::ios::sync_with_stdio(false);
cout.tie(0);
int n, k;
cin >> n >> k;
if (k == 0) {
per(i, 2 * n, 1) cout << i << ' ';
return 0;
}
cout << 1 << ' ' << k + 1 << ' ';
per(i, 2 * n, 2) {
if (i == k + 1) continue;
cout << i << ' ';
}
return 0;
}
作者

Gesrua

发布于

2019-07-22

更新于

2020-11-21

许可协议