首页 > 其他分享 >CF1906K Deck-Building Game记录

CF1906K Deck-Building Game记录

时间:2023-12-17 20:24:22浏览次数:26  
标签:Building cnt int res 卷积 Game CF1906K 多项式 Pn

CF1906K Deck-Building Game

题目链接:https://codeforces.com/problemset/problem/1906/K

题意

有大小为 $n$ 的多重集 $A$。求找到两个不相交子集,使它们各自的异或和相等的方案数。

很容易将其转换为求如下值:

$$ \sum_{S \subset A} 2 ^ {|S|} \cdot [\oplus_{x \in S} x = 0] $$

解法(官解)

构造多项式 $F$,使得 $F_i(A) = \sum_{S \subset A} 2 ^ {|S|} \cdot [\oplus_{x \in S} x = i]$,要求的结果是 $F_0(A)$。

那么 $F$ 满足如下特性:$F(A \cup B) = F(A) \oplus F(B)$,其中 $\oplus$ 代表多项式的异或卷积

对只包含同一个数的集合,容易求出多项式只包含两项:

$$ F(\set{i} \cdot n) = a_0 + a_i \cdot x^i, a_i = \dfrac{1}{2} ((-1)^n + 3^n), a_0 = 3^n - a_i $$

记 $U = 2^{\lceil \log\max{A}\rceil}$,则卷积合并所有多项式即可得到答案,时间复杂度 $O(U^2 \log U)$。

考虑采用分治卷积优化时间复杂度。记 $G(l,r)$ 为所有 $i \in [l,r)$ 对应多项式的卷积,可以观察到如下性质:

  • 若采用分治法计算,则一定有 $r - l = 2^b, l \equiv r \equiv 0 \mod 2^b$;
  • $G(l,r)$ 中所有项的次数落在区间 $[0, r-l)$ 和 $[l, r)$ 内。

因此,分治的每一层只需维护两个次数小于 $r-l$ 的多项式,合并时计算四次卷积即可。根据主定理可得时间复杂度为 $O(U \log^2 U)$。

代码实现(C++)

constexpr int M = 1 << 17;
using P = pair<int, vector<Z>>;
using A = array<P, 2>;
void solve() {
    int n;
    cin >> n;
    vector<int> cnt(M);
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        cnt[x]++;
    }
    function<A(int, int)> calc = [&](int l, int r) -> A {
        if (r - l == 1) {
            A res;
            res[0] =
                pair{0, vector<Z>{(-Z(-1).pow(cnt[l]) + Z(3).pow(cnt[l])) / 2}};
            res[1] =
                pair{l, vector<Z>{(Z(-1).pow(cnt[l]) + Z(3).pow(cnt[l])) / 2}};
            return res;
        } else {
            A res;
            vector<Z> RP1(r - l, 0), RP2(r - l, 0);
            int mid = (l + r) >> 1;
            A a1 = calc(l, mid), a2 = calc(mid, r);
            for (auto [base1, P1] : a1) {
                for (auto [base2, P2] : a2) {
                    int base = base1 ^ base2;
                    auto Pn = XOR_convolution(P1, P2);
                    if (base >= l) {
                        for (int i = 0; i < (int)Pn.size(); i++) {
                            RP2[(i ^ base) - l] += Pn[i];
                        }
                    } else {
                        for (int i = 0; i < (int)Pn.size(); i++) {
                            RP1[i ^ base] += Pn[i];
                        }
                    }
                }
            }
            return {pair{0, RP1}, {l, RP2}};
        }
    };
    A res = calc(0, M);
    cout << res[0].second[0] + res[1].second[0] << "\n";
}

标签:Building,cnt,int,res,卷积,Game,CF1906K,多项式,Pn
From: https://www.cnblogs.com/cpchenpi/p/17909695.html

相关文章

  • pygame安装问题
    pygame的安装问题(1)python-mpipinstall--upgradepip(2)pipinstallpygame(3)更换下载网站,且赋予信任pipinstallpygame-ihttp://pypi.douban.com/simple--trusted-hostpypi.douban.com(4)python-mpipinstall-Upygame--user(5)python-mpipinstall-Upy......
  • CTFpwnAD世界dice_game题解wp
    惯例checksec一下看看main首先seed函数用时间生成一个随机数,这个随机数做为srand函数的参数让srand函数生成一个种子。(这个种子会影响后面的rand函数生成结果,并且同样的种子会使rand函数生成同样的随机数,就是所谓的伪随机)以及看到这里会有连续五十轮游戏。sub_A20这里就是每一轮......
  • CF1610H Squid Game
    题意给定一棵树,以及\(m\)条路径。让你选出最少的点,使得对于每一条路径,都有一个点距离链上的点离端点更近。Sol考虑将每一条路径分为直链和曲链考虑。注意到所有的曲链最多对答案有\(1\)的贡献。考虑直链的情况。注意到一个很显然的东西。对于一个选择的点,如果她的上方......
  • 奇偶game
    证明一下边带权做法的充分性我们考虑异或和对一个01序列,我们做一个异或前缀和,设为\(sum_n\),那么\(a_i=sum_i\enspacexor\enspacesum_{i-1}\)对任何时刻的没有产生矛盾的并查集森林,我们随便给每个森林的根节点赋值一个0或1,那么其他所有节点的值也能够推导出来(注意中途不可能重......
  • Game = Rust + WebAssembly + 浏览器
    ❝努力成为一个情绪价值的提供者❞大家好,我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder。前言在上一篇Rust编译为WebAssembly在前端项目中使用我们通过一个简单的HelloWorld的Demo,讲述了如何将Rust编译为WebAssembly,并在前端项目中使用。虽然,......
  • games101-2 透视深度插值矫正与抗锯齿分析
    透视深度插值矫正与抗锯齿分析深度插值的差错原因透视深度插值公式推导games101中的错误msaa与ssaa简要定义games101中ssaa的实现games101中msaa的实现深度插值的差错原因当投影的图形与投影的平面不平行时,这时进行透视投影,从上图中可以看出,投影平面上的线段时均匀......
  • ICPC2022Hangzhou C No Bug No Game 题解
    LinkICPC2022HangzhouCNoBugNoGameQuestion给定\(n\)个物品和上限\(k\),要求最大化分数,物品的选择顺序可以任意第\(i\)个物品一行\(p_i\)代表个数,后面\(p_i\)个\(w_j\)代表容量,定义\(sum=\sum\limits_{j=1}^{i-1}\),对于第\(i\)个物品\(sum+p_i\lek\)......
  • A. Flipping Game
    A.FlippingGame本质上是让我们找出一段区间内\(0\)的个数大于\(1\)的个数的最多的区间,且必须进行一次操作,所以可以考虑区间\(dp\),或者最小子序列和1最小子序列和\[\begin{aligned}dp_i是以a_i结尾的最小子序列和\\dp_i=\min(dp_{i-1}+a[i],a[i])\end{aligned}\]#inc......
  • Codeforces Round 912 (Div. 2) E - Geo Game
    考虑什么时候会改变答案的奇偶,显然可以根据\(x\oplusy\)的奇偶性分组,在组内进行跳跃不会改变,只有当组间跳跃的时候才会改变。打表观察先手什么时候必胜,其中:\(u\)是当前获胜目标为奇/偶(1/0),\(v\)是位于哪一组,\(a,b\)代表两组还剩多少,\(st\)代表当前答案的奇偶性。intdfs(intu,......
  • Game Physics
    BasicconceptsformphysicsRigidBodyClassificationSingleparticlesandparticlessystemareexamplesofdiscretematerial.Thestandardnotationis\[Q_{total}=\sum\limits_{i=1}^{p}Q_{i}\]Anothertypeofbodyisreferredtoasacontinuousma......