一个显然的思路就是构造很多互不相关的上升序列。但是这样构造出来的 \(n\) 是 \(O(\log_2^2 n)\) 量级的,所以需要考虑新做法。
假设我们本来有一个上升序列,我们能否往里面插数?如果插入的数前面本来有 \(x\) 个数,那么它有 \(2^x\) 的贡献。于是容易想到先写一个最大的上升序列,再二进制拆分即可。
#include <bits/stdc++.h>
using namespace std;
long long read() {
char c = getchar();
long long x = 0, p = 1;
while ((c < '0' || c > '9') && c != '-') c = getchar();
if (c == '-') p = -1, c = getchar();
while (c >= '0' && c <= '9')
x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return x * p;
}
const int N = 207;
long long x;
void solve() {
x = read();
long long p = 1, k = 0;
while (p * 2 <= x) {
p *= 2;
k ++;
}
x -= p;
vector <int> bit;
int cnt = 0;
while (x) {
bit.push_back(x % 2);
cnt += (x % 2 == 1); x /= 2;
}
cout << cnt + k << '\n';
for (int i = 0, j = cnt + k; i <= k; i ++) {
if (i > 0)
cout << i << ' ';
if (i < (int) bit.size() && bit[i])
cout << (j --) << ' ';
}
cout << '\n';
}
signed main() {
int t = 1;
t = read();
while (t --) solve();
return 0;
}
标签:CF1922E,long,while,Subsequences,&&,序列,Increasing,getchar
From: https://www.cnblogs.com/yh2021shx/p/18090520