E. Increasing Subsequences__2

纯粹的發表於2024-03-13

原題連結

題解

已知對於一個長度為 \(n\) 的連續+1型上升序列而言,其滿足要求的子序列有\(2^n\)

若我們在該序列下標為 \(k\) 的右邊插入一個絕對大於左邊,絕對小於右邊的數,滿足要求的子序列會增加 \(2^k\)

由此想到極限構造加二進位制,其中最高位的一不用管,其餘的每一位生成上升序列,如果有一就在生成前插入
注意細節!!

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll n;
        cin>>n;
        queue<ll> q;
        int l=-1e9,r=1e9;
        ll len=0;
        while(n>1)
        {
            q.push(n%2);
            len+=1+n%2;
            n/=2;
        }

        cout<<len<<endl;
        while(q.size())
        {
            if(q.front()==1) cout<<r--<<" ";
            cout<<l++<< " ";
            q.pop();
        }
        puts("");
    }
    return 0;
}

相關文章