码迷,mamicode.com
首页 > 其他好文 > 详细

[CF960C] Subsequence Counting - 构造

时间:2020-04-28 15:16:36      阅读:39      评论:0      收藏:0      [点我收藏+]

标签:def   它的   mes   end   esc   进制   clu   name   mat   

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

[CF960C] Subsequence Counting - 构造

标签:def   它的   mes   end   esc   进制   clu   name   mat   

原文地址:https://www.cnblogs.com/mollnn/p/12793834.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!