CF1922E Increasing Subsequences

一个显然的思路就是构造很多互不相关的上升序列。但是这样构造出来的 nO(log22n) 量级的,所以需要考虑新做法。

假设我们本来有一个上升序列,我们能否往里面插数?如果插入的数前面本来有 x 个数,那么它有 2x 的贡献。于是容易想到先写一个最大的上升序列,再二进制拆分即可。

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

作者:DE_aemmprty

出处:https://www.cnblogs.com/aemmprty/p/18090520

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   DE_aemmprty  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示