zoukankan      html  css  js  c++  java
  • 高维前缀和

    修了一些我发现的锅,可能还有一些锅,欢迎来锤

    其实我也不知道是不是叫这个名字。


    假设有一个数组 (a_0,a_1,...,a_{2^n}) ,求一个数组 (b_x=sumlimits_{i|x=x} a_i) ,即子集和。(妈呀不就是 fwt_or 吗)

    先上代码:

    for(int i=0;i<n;i++)
    {
    	for(int j=0;j<(1<<n);j++)
    	{
    		if(j&(1<<i)) a[j]+=a[j^(1<<i)];
    	}
    }
    

    原理:从小到大枚举每一位,然后合并。

    如图,显然他是正确的(从下往上看)。

    )


    假设有一个数组 (a_0,a_1,...,a_{2^n}) ,求一个数组 (b_x=sumlimits_{i&x=x} a_i) ,即超集和。(妈呀不就是 fwt_and 吗)

    先上代码:

    for(int i=0;i<n;i++)
    {
    	for(int j=0;j<(1<<n);j++)
    	{
    		if(!(j&(1<<i))) a[j]+=a[j^(1<<i)];
    	}
    }
    

    原理:从小到大枚举每一位,然后合并。

    如果不理解,可以画图手玩。


    不是有 fwt 了吗,要这个干什么 。

    发现他的性质非常优,不仅可以在 (O(ncdot 2^n)) 的复杂度内维护和,积,(max,min) 等支持交换律操作都可以维护。


    题目:CF449D (但是先挖个坑,两天内来填)

    我回来填坑了。

    对于一个数,假设他出现了 (x) 遍,显然,他被选入答案的方案数是 (2^x-1)

    算出 (a_i)(i) 的超集和,那么跑一边容斥即可知道答案。

    Code

  • 相关阅读:
    jsp mysql 配置线程池
    服务端 模拟 检测 攻击。。乱写
    硕思闪客精灵 7.2 破解版
    unity UnityAwe 插件
    smartfoxserver 2x 解决 Math NAN
    unity 断点下载
    java 监听文件目录修改
    wind7 64 setup appjs
    sfs2x 修改jvm 内存
    unity ngui 解决图层问题
  • 原文地址:https://www.cnblogs.com/wasa855/p/12663227.html
Copyright © 2011-2022 走看看