E. Increasing Subsequences

原题链接

题解 太巧妙了

1.对于一个递增子序列个数为 \(sum\) ,元素值域为 \([l,r]\) 的序列而言
在最右端插入一个

  • \(l-1\) ,对 \(sum\) 的影响是 \(+1\)
  • \(r+1\) ,对 \(sum\) 的影响是 \(*2\)

由于乘二加一可以在两百次操作内使 \(sum\) 能达到任意 \(X\) ,(gan jue)
然后空序列的 \(sum\) 是1,因此我们依靠倒推得出序列(我们从1e9开始,这样确保r/l是递减/递增,且数量足够)

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll x;
void solve()
{
    stack<ll> ans;
    ll l=-1e9,r=1e9;
    while(x>1)
    {
        if(x%2)
        {
            ans.push(l++);
            x--;
        }
        else
        {
            ans.push(r--);
            x>>=1;
        }
    }

    cout<<ans.size()<<endl;
    while(ans.size())
    {
        cout<<ans.top()<<" ";
        ans.pop();
    }
    cout<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    ll t;
    cin>>t;
    while(t--)
    {
        cin>>x;
        solve();
    }
    return 0;
}

posted @ 2024-01-23 01:10  纯粹的  阅读(25)  评论(0)    收藏  举报