首页 > 其他分享 >「解题报告」ARC132F Takahashi The Strongest

「解题报告」ARC132F Takahashi The Strongest

时间:2023-03-16 16:35:59浏览次数:42  
标签:ARC132F int long Strongest MAXN bmatrix FWT Takahashi

不会 FWT 的真实。需要重写篇 FWT 博客。

考虑 Takahashi 获胜当且仅当 Aoki 和 Snuke 选的相同,Takahashi 选的是它的下一个。

至少有一个相等,可以容斥为所有的都不相等。

那么相当于两个数能够给一个集合造成贡献。比如 \(R, R \to \{R, S\}\),\(R, P \to \{R, P, S\}\)。

发现只有四种集合,我们就可以将这四种集合定一个 \([0, 3]\) 的数,然后考虑构造一个位运算。

容易得出 \(a \oplus b = \begin{cases}a & a=b\\3&a\ne b\end{cases}\)。

需要满足 \(c_0, c_1, c_2 \in \{0, 1\},\ c_0 c_1 = c_0 c_2 = c_1 c_2 = c_3\),那么有 \([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0], [1, 1, 1, 1]\) 四组解。

可以构造出 FWT 的转移矩阵 \(\begin{bmatrix}1 & 0 & 0 & 1\\0 & 1 & 0 & 1\\0 & 0 & 1 & 1\\0 & 0 & 0 & 1\end{bmatrix}\),其逆矩阵 \(\begin{bmatrix}1 & 0 & 0 & -1\\0 & 1 & 0 & -1\\0 & 0 & 1 & -1\\0 & 0 & 0 & 1\end{bmatrix}\)。实际上就是对于 \(3\) 这一位做了前缀和。

最后由于一位是对一个集合贡献,再类似于 FWT 转移一遍即可。

复杂度 \(O(k 4^k)\)。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 18000005;
long long a[MAXN], b[MAXN], c[MAXN];
int k, n, x, y;
char s[123];
int mp[255];
void fwt(long long *t) {
    for (int mid = 1; mid < n; mid <<= 2) 
        for (int l = 0; l < n; l += (mid << 2)) 
            for (int i = 0; i < mid; i++) 
                t[l + i + 3 * mid] += t[l + i] + t[l + i + mid] + t[l + i + 2 * mid];
}
void ifwt(long long *t) {
    for (int mid = 1; mid < n; mid <<= 2) 
        for (int l = 0; l < n; l += (mid << 2)) 
            for (int i = 0; i < mid; i++) 
                t[l + i + 3 * mid] -= t[l + i] + t[l + i + mid] + t[l + i + 2 * mid];
}
int main() {
    scanf("%d%d%d", &k, &x, &y);
    n = 1 << (2 * k);
    mp['P'] = 0, mp['R'] = 1, mp['S'] = 2;
    for (int i = 1; i <= x; i++) {
        scanf("%s", s); int v = 0;
        for (int j = 0; j < k; j++) v |= mp[s[j]] << (2 * j);
        a[v] = 1;
    }
    for (int i = 1; i <= y; i++) {
        scanf("%s", s); int v = 0;
        for (int j = 0; j < k; j++) v |= mp[s[j]] << (2 * j);
        b[v] = 1;
    }
    fwt(a), fwt(b);
    for (int i = 0; i < n; i++) c[i] = a[i] * b[i];
    ifwt(c);
    for (int mid = 1; mid < n; mid <<= 2) 
        for (int l = 0; l < n; l += (mid << 2)) 
            for (int i = 0; i < mid; i++) {
                long long A = c[l + i], B = c[l + i + mid], C = c[l + i + 2 * mid], D = c[l + i + 3 * mid];
                c[l + i] = A + C + D;
                c[l + i + mid] = A + B + D;
                c[l + i + 2 * mid] = B + C + D;
                c[l + i + 3 * mid] = 0;
            }
    for (int i = 0; i < n; i++) {
        bool flag = true;
        int rev = 0;
        for (int j = 0; j < k; j++) {
            flag &= (i >> (2 * j) & 3) < 3;
            rev |= (i >> (2 * j) & 3) << ((k - j - 1) * 2);
        }
        if (flag) {
            c[rev] = 1ll * x * y - c[rev];
            printf("%lld\n", c[rev]);
        }
    }
    return 0;
}

标签:ARC132F,int,long,Strongest,MAXN,bmatrix,FWT,Takahashi
From: https://www.cnblogs.com/apjifengc/p/17223024.html

相关文章

  • C - Make Takahashi Happy
    题目大意:左上角走到右下角,经过的路径权值连起来不能有重复,把没有重复的路径的条数加起来输出。我自己写的时候也磕磕绊绊,主要是自己模拟一边,理明白了就好了#include<ios......
  • ABC240G Teleporting Takahashi
    ABC240GTeleportingTakahashi洛谷:ABC240GTeleportingTakahashiAtcoder:ABC240GTeleportingTakahashiProblem在一个空间直角坐标系中移动,每步可以沿着坐标轴正/负......
  • [ABC250Ex] Trespassing Takahashi 题解
    [ABC250Ex]TrespassingTakahashiSolution目录[ABC250Ex]TrespassingTakahashiSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面给......
  • [ABC256E] Takahashi's Anguish 题解
    [ABC256E]Takahashi'sAnguishSolution目录[ABC256E]Takahashi'sAnguishSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面存在$n......
  • Destroyer Takahashi
    DestroyerTakahashi题解:区间选点问题这里面他又给出了D,D其实可以代表他从右端点还可以往外延申D-1的长度,实际上每次的\(now=a[i].r+D-1\)#include<bits/stdc++.h>......
  • [ABC233G] Strongest Takahashi
    ProblemStatementThereisa$N\timesN$grid,withblocksonsomesquares.Thegridisdescribedby$N$strings$S_1,S_2,\dots,S_N$,asfollows.Ifthe$j$-t......
  • D - Takahashi's Solitaire -- ATCODER
    D-Takahashi'sSolitairehttps://atcoder.jp/contests/abc277/tasks/abc277_d 思路先计算所有的输入的和total,将输入列表首先进行排列找到所有连续段和中最大的......
  • C - Ladder Takahashi -- ATCODER
    C-LadderTakahashihttps://atcoder.jp/contests/abc277/tasks/abc277_c 思路把梯子可达楼层看成图的节点把梯子看成节点之间的连线所以整个问题变成图的遍历问题......
  • AtCoder Beginner Contest 277 D Takahashi's Solitaire
    Takahashi'sSolitaire双指针&&尺取先排个序,然后把数组扩展到\(2\timesn\),为了处理循环的情况然后双指针跑一下,限定\(r\)扩展的条件为:当前数字等于前一个或者......