AIM Tech Round 3 (Div. 1) B. Recover the String 构造

题意

你要构造一个只含有01的串,其中子序列:00有a个,01有b个,10有c个,11都d个。

如果不能,输出impossible

题解:

通过00和11,我们知道这个串里面0和1分别有多少个,然后我们就可以构造了。

假设0全部放在前面,1全部放在后面,那么如果把一个1扔到最前面,那么C就会减去当前0的个数。

然后我们就通过这个玩意儿去构造就好了

#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF  0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-12
#define maxn 100100
#define MOD 1000000007
#define ll long long

long long a,b,c,d;
long long ok(long long x)
{
    for(long long i = 1; i * (i-1) <= x; i++)
        if(x == i * (i-1))
            return i;
    return 0;
}
int main()
{
    int T;
    while(scanf("%lld%lld%lld%lld",&a,&b,&c,&d) != EOF)
    {
        long long sum = a + b + c + d;
        long long len = ok(sum*2);
        long long x1 = ok(a*2),x2 = ok(d*2);
        //printf("%lld %lld %lld\n",len,x1,x2);
        if(!sum)
        {
            printf("0\n");
            continue;
        }
        if(len && (sum == a || sum == d))
        {
            for(int i = 0; i < len; i++)
                printf("%d",sum == a?0:1);
            printf("\n");           
            continue;
        }
        if(!len || !x1 || !x2 || x1+x2 != len)
        {
            printf("Impossible\n");
            continue;
        }
        long long bb = x1 * x2,cc = 0;
        //printf("%lld %lld\n",bb,cc);
        if(bb + cc != b + c)
        {
            printf("Impossible\n");
            continue;
        }
        long long A = x1;
        for(long long i = 0; i < len; i++)
        {
            if(c - cc >= A)
            {
                cc += A;
                printf("1");
            }
            else
            {
                A--;
                printf("0");
            }
        }
        printf("\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值