题解:P12387 纯白之箭
题解:P12387 纯白之箭
题目思路
构造题。
结论如下:
\[S_n=
\left\{\begin{matrix}
\underbrace{\texttt{bbbb}\cdots}_{a_n 个 b}\underbrace{\texttt{aaaa}\cdots}_{a_{n-1} 个 a} ,& n\bmod 2=0\\
\underbrace{\texttt{aaaa}\cdots}_{a_n 个 a}\underbrace{\texttt{bbbb}\cdots}_{a_{n-1} 个 b} ,& n\bmod 2\neq 0
\end{matrix}\right.
\]
考虑证明:
- 显然可以看到,\(S_n\) 与 \(a_{n-1}\) 和 \(a_n\) 存在某种联系。
- 也就是说,\(S_n\) 可以分成 \(2\) 个部分,前半部分是 \(a_{n}\) 的 border 部分,则后半部分为 \(a_{n-1}\) 的 border 部分。
- 所以用不同的字母表示两个部分即可。字母不一定是
a
或b
。
代码实现:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll a[N],n;
string s[N];
void slove(){
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=a[1];i++) s[0]+='x';
for(int i=1;i<=n;i++){
for(int j=1;j<=a[i+1];j++){
if(i%2==1) s[i]+='y';
else s[i]+='x';
}
for(int k=1;k<=a[i];k++){
if(i%2==1) s[i]+='x';
else s[i]+='y';
}
}
for(int i=0;i<=n;i++) cout<<s[i]<<'\n';
}
int main(){
cin>>n;
slove();
return 0;
}
时间复杂度 \(O(n^2)\)。