zoukankan      html  css  js  c++  java
  • [CF960C] Subsequence Counting

    Description

    找到一个数列(长度不超过 (10^4)),使得有且仅有 (x) 个非空子数列中元素极差小于 (d),或者判定不存在。

    Solution

    考虑如何让后加的子序列中的数不会影响到前面的,只需要加一个 (d),就可以形成新的一组

    于是我们需要将自学列拆成若干个互不相干的组,每组内取一个相同的值

    对于一个含有 (n) 个元素的组,它的贡献是 (2^n-1)

    假如这个贡献是 (2^n) 就可以直接二进制分解做了

    那么我们强行补一个大小为 (1) 的组,这样就可以当做它是 (2^n)

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 1000005;
    
    int n,x,d,a[N],m;
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>x>>d;
        for(int i=31;i>=0;--i) {
            if(x&(1ll<<i)) {
                a[m]=i;
                a[m+1]=1;
                n+=i+1;
                m+=2;
            }
        }
        cout<<n<<endl;
        for(int i=0;i<m;i++) {
            while(a[i]--) cout<<1+d*i<<" ";
        }
    }
    
  • 相关阅读:
    108.异常的传递
    107.捕获异常
    106.异常、模块(异常介绍)
    105.面向对象案例-烤红薯
    104.多态案例
    103.继承案例二
    102.继承案例一
    101.自定义玩家类
    100.自定义枪类
    python基础入门之十四 —— 文件操作
  • 原文地址:https://www.cnblogs.com/mollnn/p/12793834.html
Copyright © 2011-2022 走看看