构造题的其中一个方法是,先构造一个基础串,然后再想办法改造成目的串。
一开始还WA了。
交代码之前一定要保证对所有输入都能处理得不重不漏。
首先分类方法以及应对各种情况的算法一定要对。
然后主要考虑最小值的特例以及最大值在计算过程或结果是否会溢出。
我是错在各种带0的输入。
这些都是特例。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int ans[1000010];
ll a00,a01,a10,a11;
int main()
{
scanf("%I64d %I64d %I64d %I64d",&a00,&a01,&a10,&a11);
ll n00=sqrt(a00*2);
ll n11=sqrt(a11*2);
if(n00*(n00+1)!=a00*2||n11*(n11+1)!=a11*2) {puts("Impossible");return 0;}
if(n00==0&&n11==0)
{
if(a01==0&&a10==0) puts("0");
else if(a01==0&&a10==1) puts("10");
else if(a01==1&&a10==0) puts("01");
else puts("Impossible");
return 0;
}
else if(n00==0)
{
if(a01==0&&a10==0)
{
for(int i=0;i<=n11;i++) printf("1");
puts("");
return 0;
}
}
else if(n11==0)
{
if(a01==0&&a10==0)
{
for(int i=0;i<=n00;i++) printf("0");
puts("");
return 0;
}
}
n00++;
n11++;
if(n00*n11!=a01+a10) puts("Impossible");
else
{
for(int i=1;i<=n11;i++) ans[i]=1;
int l=n11;
int r=n00+n11;
while(r-l<=a01)
{
swap(ans[l],ans[r]);
l--;
r--;
a01-=r-l;
}
swap(ans[l],ans[l+a01]);
for(int i=1;i<=n00+n11;i++) printf("%d",ans[i]);
puts("");
}
return 0;
}