首页 > 其他分享 >CF1922E Increasing Subsequences

CF1922E Increasing Subsequences

时间:2024-03-22 22:22:23浏览次数:26  
标签:CF1922E long while Subsequences && 序列 Increasing getchar

一个显然的思路就是构造很多互不相关的上升序列。但是这样构造出来的 \(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

相关文章

  • E. Increasing Subsequences__2
    原题链接题解已知对于一个长度为\(n\)的连续+1型上升序列而言,其满足要求的子序列有\(2^n\)个若我们在该序列下标为\(k\)的右边插入一个绝对大于左边,绝对小于右边的数,满足要求的子序列会增加\(2^k\)个由此想到极限构造加二进制,其中最高位的一不用管,其余的每一位生成上升......
  • [ARC122E] Increasing LCMs 题解
    Description给定长度为\(N\)的正整数序列\(\{A_i\}\),满足\(A_i\)单调升。问是否能将\(\{A_i\}\)重排为序列\(\{x_i\}\),满足:令\(y_i=\operatorname{LCM}(x_1,\dots,x_i)\),\(\forall1\lei<N,y_i<y_{i+1}\)(即\(y_i\)单调升)。$1\\leq\N\\leq\......
  • CF1922E Increasing Subsequences 题解
    解题思路因为可以有空集,那么我们首先构造第一段最长的连续上升的序列,那么这段序列中共有\(2^{\mids\mid}\)个上升子序列。接下来我们考虑补全剩余的,我们不妨将剩余的部分全部设为连续不增序列,那么设当前位置在第一段中有\(k\)个小于它的,那么添加这个数后可以增加\(2^{k-1}......
  • CF1924D Balanced Subsequences
    题意简述有\(n\)个左括号和\(m\)个右括号,求最长合法括号子序列长度为\(2k\)的括号序列的数量,对\(10^9+7\)取模。多组数据。\(T\le3\times10^3,n,m,k\le2\times10^3\)分析可能需要的前置知识:如何求一个字符串的最长合法括号子序列?维护一个括号栈,若遇到左括号则直接......
  • CodeForces 1924D Balanced Subsequences
    洛谷传送门CF传送门发现去掉匹配的\(2k\)个括号后,剩下的串一定形如\())\ldots)((\ldots(\),其中右括号数量为\(a=m-k\),左括号数量为\(b=n-k\)。考虑把剩下的串像\())\ldots)\mid((\ldots(\)一样分成两半。枚举左半边加入了\(\frac{i}{2}\)对匹配,则......
  • CF1621G Weighted Increasing Subsequences
    CF1621GWeightedIncreasingSubsequences你有一个长度为\(n\)的序列,定义\(a\)的一个长度为\(k\)的子序列为\(a_{i_1},a_{i_2},\dots,a_{i_k}\)。由此,我们不难发现,\(a\)的一个长度为\(k\)的子序列为上升子序列,当且仅当\(\forallj\in[1,k)\),\(a_{i_j}<a_{i_{j+1}}\)......
  • [Codeforces] CF1817A Almost Increasing Subsequence
    CF1817AAlmostIncreasingSubsequence题意给定长度为\(n\)一个序列\(a\)以及\(q\)次询问,每次询问给出\(l\)和\(r\),找出序列\(a\)在\([l,r]\)内最长的几乎递增子序列。对于几乎递增的定义:如果一个序列中不存在连续的三个数\(x\),\(y\),\(z\),使得\(x\gey\ge\......
  • [CF83E] Two Subsequences 题解
    [CF83E]TwoSubsequences题解思路定义\(overlap(a,b)\)为字符串\(a\)的后缀与\(b\)的前缀的最大相等的长度,有\(|f(a,b)|=|a|+|b|-overlap(a,b)\),下文称匹配为相邻两串的\(overlap\)。观察到每次操作之后,一定有一个序列是以\(a_i\)为结尾的。所以根据这个......
  • 【刷题笔记】115. Distinct Subsequences
    题目Giventwostrings s and t,return thenumberofdistinctsubsequencesof s whichequals t.Astring's subsequence isanewstringformedfromtheoriginalstringbydeletingsome(canbenone)ofthecharacterswithoutdisturbingtheremainingch......
  • [ARC122E] Increasing LCMs
    ProblemStatementWehaveasequenceof$N$positiveintegers:$A_1,A_2,\cdots,A_N$.Youaretorearrangetheseintegersintoanothersequence$x_1,x_2,\cdots,x_N$,where$x$mustsatisfythefollowingcondition:Letusdefine$y_i=\operatorname{LCM}(x......