题目:
给出整数 n n n, k k k
构造一个长度为 2 × n 2 \times n 2×n 的序列 a a a
满足:
∑
i
=
1
n
∣
a
2
i
−
a
2
i
−
1
∣
−
∣
∑
i
=
1
n
a
2
i
−
a
2
i
−
1
∣
=
2
k
\sum_{i=1}^n |a_{2i} -a_{2i-1}| -|\sum_{i=1}^n a_{2i}-a_{2i-1}| = 2k
i=1∑n∣a2i−a2i−1∣−∣i=1∑na2i−a2i−1∣=2k
1 ≤ n ≤ 50000 1≤n≤50000 1≤n≤50000 , 0 ≤ 2 k ≤ n 0≤2k≤n 0≤2k≤n
思路:
首先,发现当 k = 0 k=0 k=0 时,一组符合要求的解为:
1 , 2 , 3 , … , n {1,2,3,…,n} 1,2,3,…,n
那我们能否只改变序列中任意相邻的两组数来使该式符合要求呢?
可以!因为题目里说 2 k ≤ n 2k≤n 2k≤n , 而 a 2 i a_{2i} a2i 与 a 2 i + 1 a_{2i+1} a2i+1 每交换一次差都会增加 2 2 2。
于是,我们就做出了这道题。
时间复杂度 O ( 2 ∗ n ) O(2*n) O(2∗n)
CODE:
#include<bits/stdc++.h>
using namespace std;
int n,k,a[100005];
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=2*n;i++)
a[i]=i;
for(int i=1;i<=2*n;i+=2)
if(k>0)
swap(a[i],a[i+1]),k--;
for(int i=1;i<=2*n;i++)
printf("%d ",a[i]);
return 0;
}