【AtCoder】AGC20C Median Sum DP&bitset优化

传送门:AGC20C


题解

考虑包括空集的全集为 2n 2 n 个,每个集合都有对应的补集。
现在不考虑 n n 的补集,一共 2n2 2 n − 2 个,一共 2n11 2 n − 1 − 1 对互补的集合,中位数就是求 2n1 2 n − 1 这个位置上的集合的值,也就是中位数集合中偏大的一个: (sum+1)/2 ( s u m + 1 ) / 2 ,总和的一半上取整。
但是枚举复杂度太大,这题只能 bitset b i t s e t 压位过。


代码

#include
int n,a,sum;
std::bitset<4000010>f;
int main(){
    scanf("%d",&n);f[0]=1;
    for(;n;--n){scanf("%d",&a);sum+=a;f|=f<for(sum=(sum+1)>>1;!f[sum];++sum);
    printf("%d",sum);
}

你可能感兴趣的:(bitset)