[CF960C] Subsequence Counting - 构造
Posted mollnn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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<<" ";
}
}
以上是关于[CF960C] Subsequence Counting - 构造的主要内容,如果未能解决你的问题,请参考以下文章
CF568E Longest Increasing Subsequence
CF888EMaximum Subsequence 折半搜索
[Luogu] CF888E Maximum Subsequence