首先,我们可以知道,当对于一个整数
�
(
1
≤
�
≤
�
)
i (1≤i≤n) 有一个整数
�
(
1
≤
�
≤
�
)
j (1≤j≤n) 使得
�
�
>
�
�
+
�
�
−
�
a
i
>a
j
+a
i−j
时,绝对是无解的。(对于一个合法序列,两个区间和最大值相加一定大于等于长度等于它们两个长度之和的区间的和最大值)
接着,在剩下的情况中,我们来构造
{
�
�
}
{b
k
}。
应用贪心的思想,我们直接来使得
�
�
=
�
�
−
�
�
−
1
b
i
=a
i
−a
i−1
,我们用数学归纳法的思想证明这种策略行得通。
首先假设
�
b 前
�
−
1
i−1 项可以满足
�
a 的条件,接下来就是要推出下一项也可以满足条件,也就是说,我们对于每一个整数
�
(
2
≤
�
≤
�
)
j (2≤j≤i) 要证明
∑
�
=
�
�
�
�
≤
�
�
−
�
+
1
∑
p=j
i
b
p
≤a
i−j+1
(构造方法已经保证
�
=
1
j=1 的情况合法)。我们可以知道,
∑
�
=
1
�
�
�
=
�
�
∑
p=1
i
b
p
=a
i
并且
∑
�
=
1
�
−
1
�
�
=
�
�
−
1
∑
p=1
j−1
b
p
=a
j−1
。由于已经排除了
�
�
>
�
�
−
1
+
�
�
−
�
+
1
a
i
>a
j−1
+a
i−j+1
的情况,那么
∑
�
=
�
�
�
�
=
�
�
−
�
�
−
1
≤
�
�
−
�
+
1
∑
p=j
i
b
p
=a
i
−a
j−1
≤a
i−j+1
,即合法。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=302;
int n,ans[N],a[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
ans[i]=a[i]-a[i-1];
for(int j=1;j<=i>>1;j++)
if(a[j]+a[i-j]<a[i])
{
cout<<"NIE";
return 0;
}
}
cout<<"TAK\n"<<n<<'\n';
for(int i=1;i<=n;i++) cout<<ans[i]<<' ';
return 0;
}