0
点赞
收藏
分享

微信扫一扫

CF709D. Recover the String(构造)

i奇异 2022-07-14 阅读 72


​​linkkkk​​​ 题意:
构造一个序列,要求序列里的个数为给定的数
思路:

  • 如果说该序列有,那么的个数为,可以预处理出这个。对于输入的个数,求出分别表示的个数
  • 如果无法求出的话说明该序列无法构造。
  • ,因为相当于任意选取一个,一定会对这两个有贡献的。
  • 假设现在一定合法,考虑如何构造这个序列。假设序列是这种形式,那么在输出的时候,如果,应该输出,因为还应当构造的个数大于等于剩下的的个数,如果放的话,只会更少,无法构造乐就。放了之后造成的影响为,并且还会构造出;反之,输出.
  • 如果只有的话,特判一下就行了。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxn=2e5+10,inf=0x3f3f3f3f;

map<ll,ll>mp;
ll a,b,c,d;

int main(){

mp[0]=1;
for(ll i=1;i*(i-1)/2<=1e9;i++) mp[i*(i-1)/2]=i;

cin>>a>>b>>c>>d;

if(!mp[a]||!mp[d]){
puts("Impossible");
return 0;
}

if(b+c+d==0){
while(mp[a]) cout<<"0",mp[a]--;
return 0;
}

if(a+b+c==0){
while(mp[d]) cout<<"1",mp[d]--;
return 0;
}

ll cnt0=mp[a],cnt1=mp[d];

if(cnt0*cnt1!=b+c){
puts("Impossible");
return 0;
}

while(cnt0+cnt1){
if(c>=cnt0){
cout<<"1";
c-=cnt0;
cnt1--;
}
else{
cout<<"0";
d-=cnt1;
cnt0--;
}
}

return 0;
}
/*


*/


举报

相关推荐

0 条评论