Title

CF1922E Increasing Subsequences 题解

解题思路

因为可以有空集,那么我们首先构造第一段最长的连续上升的序列,那么这段序列中共有 2s 个上升子序列。接下来我们考虑补全剩余的,我们不妨将剩余的部分全部设为连续不增序列,那么设当前位置在第一段中有 k 个小于它的,那么添加这个数后可以增加 2k1 个子序列,那么直接循环添加,如果增加后超过 x 了,那么 kk1 即可。在循环结束后,如果 x 任然有剩,那么输出 -1

AC 代码

#include<stdio.h>
#include<stdlib.h>
#define ll long long
#define N 205
ll x;int a[N];
int _2[N];
inline void work(){
    scanf("%lld",&x);
    int ce=0;ll y=x;
    while(y){
        _2[++ce]=y&1;
        y>>=1;
    }
    for(register int i=1;i<ce;++i)
        a[i]=i;int n=ce-1;
    x-=1ll*(1ll<<(ce-1));
    int now=ce-1;
    while(x>0){
        while(x<(1ll<<(now-1))&&now>0)
            --now;
        if(now==0) break;
        while(x>=(1ll<<(now-1))&&now>0)
            a[++n]=now,x-=(1ll<<(now-1));
    }if(x){
        puts("-1");
        return;
    }printf("%d\n",n);
    for(register int i=1;i<=n;++i)
        printf("%d ",a[i]);
    putchar('\n');
}
signed main(){
    int T;scanf("%d",&T);
    while(T--) work();
}
posted @   UncleSam_Died  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示