21 ICPC 昆明 D

Divisions

题链
构造 重点是以最少的变量最简单的方式
第一下就想到了二进制平凑
我们发现我们只需要让S先是一个单调不减的序列
要是有相等的 我们就可以拿去B 并且拿去B的满足每个数字不相干
但是我们仔细发现每个块只有2^n-1种(因为大家公用了空这种) 那没关系
我们除了最后加1就可以了 加的1的个数就是二进制种1的个数
最后记得特判我们空的那一种就可以了
当然我们也可以直接用2^n-1进制平凑也可以

void solve(){
    int n;cin>>n;
    if(n==1){
        cout<<6<<endl;
        cout<<"1 1 4 5 1 4"<<endl;
        return;
    }
    if(n==0){
        cout << "9\n";
        cout << "7 8 9 4 5 6 1 2 3\n";
        return;
    }
    vector<int>ans;
    n--;
    int cnt=0;
    for(int i=0;i<30;i++){
        if(n>>i&1){
            for(int j=1;j<=i;j++){
                ans.push_back(i+1);
            }
            cnt++;
        }
    }
    for(int i=1;i<=cnt;i++){
        ans.push_back(i+100);
    }
    cout<<ans.size()<<endl;
    for(auto i:ans)cout<<i<<' ';
}
posted @ 2022-11-30 14:59  ycllz  阅读(24)  评论(0)    收藏  举报