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;
}

浙公网安备 33010602011771号