首页 > 其他分享 >ABC 271 F - XOR on Grid Path(搜索 meet in the mid)

ABC 271 F - XOR on Grid Path(搜索 meet in the mid)

时间:2022-10-08 21:37:04浏览次数:87  
标签:ABC XOR 22 int sum mid 异或 mp step

ABC 271 F - XOR on Grid Path

题意:

​ 给出20 * 20的地图,每个点上都有一个点权,保证为正整数。请问从(1, 1)走到(n, n)且路径上所有点权异或和为0的路径有多少条。

思路:

​ 本题利用了meet in the mid的思想。因为是(1, 1)到(n, n),所以一定会在某个中间的地方相遇。

​ 走到某点(x, y)会有很多种路径,以及很多个不同的异或和值。因为从(1, 1)走到(n, n)一共是2 * n步。

​ 我们预处理从(1, 1)只向右下走,走到(x, y),且步数为n的时候停止,并将异或和加入\(mp[x][y][val] ++\)。

​ 然后再从(n, n)只向左上走,走到(x, y)的时候,如果此时的异或和有这样的值存在\(mp[x][y]\),就把方案数加上。

​ 这样做的时间复杂度是2 * C(20, 10),还有一个map的log复杂度。(用umap可能被卡到O(n),在CF慎用)。

实现:

​ \(map<int, int> [x][y]\)为走到(x, y)的时候,他的不同的值和其方案数。

int n;
int c[22][22];
map<int, int> mp[22][22];
int res = 0;

void dfs1(int x, int y, int step, int sum)
{
    if (step == n)
    {
        mp[x][y][sum ^ c[x][y]]++; //最后一步
        return;
    }
    if (x + 1 <= n)
        dfs1(x + 1, y, step + 1, sum ^ c[x][y]);
    if (y + 1 <= n)
        dfs1(x, y + 1, step + 1, sum ^ c[x][y]);
}

void dfs2(int x, int y, int step, int sum)
{
    if (step == n)
    {
        res += mp[x][y][sum];
        return;
    }
    if (x - 1 >= 1)
        dfs2(x - 1, y, step + 1, sum ^ c[x][y]);
    if (y - 1 >= 1)
        dfs2(x, y - 1, step + 1, sum ^ c[x][y]);
}

signed main()
{
    ios::sync_with_stdio(false);cin.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            cin >> c[i][j];

    dfs1(1, 1, 1, 0);
    dfs2(n, n, 1, 0);
    cout << res << '\n';
}

标签:ABC,XOR,22,int,sum,mid,异或,mp,step
From: https://www.cnblogs.com/DM11/p/16770256.html

相关文章

  • XOR on Grid Path(Meet in the Middle)
    题意给定一个\(N\timesN\)的方阵,元素为\(a_{ij}\)。最初位于\((1,1)\)处,每次只能往右或往上走一格。问走到\((N,N)\)时,途径元素异或和为\(0\)的方案数为多少。题目链......
  • D1. Xor-Subsequence (easy version)
    D1.Xor-Subsequence(easyversion)https://codeforces.ml/problemset/problem/1720/D1题意给你长度为n的数组a让你找出a最长的子序列满足\(a_b_p*b_p+1<a_b_p+1......
  • CF1415D XOR-gun 题解 二分答案/贪心
    题目链接https://codeforces.com/problemset/problem/1415/D题目大意给定一个长为\(n\)的不降序列,每次操作可以任选相邻的两个数,并将这两个数替换为两个数按位异或的......
  • Educational Codeforces Round 32 G Xor tree Boruvka算法
    求一个n个点的完全图每条边的权值为两点之间的异或值求最小生成树。在完全图上做最小生成树一般都是Boruvka算法即每次每个点都找一个离自己最近的点合并这样最多合并lo......
  • ABC 249 C - Just K(dfs)
    https://atcoder.jp/contests/abc249/tasks/abc249_c题目大意:给定n个字符串,让我们随意选择,然后找到这里面相同的字母刚好等于k个的时候的数量是多少?求可选择出来的最......
  • ABC 249 D - Index Trio(暴力/倍增)
    https://atcoder.jp/contests/abc249/tasks/abc249_d题目大意:给定n个数字,问我们能够满足Ai/Aj==Ak的数量有多少?i,j,k只需要在下标的范围内即可,无硬性要求。SampleInp......
  • ABC267Ex - Odd Sum
    分治NTTEx-OddSum(atcoder.jp)题意给一个长度为\(n\;(1<=n<=10^5)\)的数组\(A\;(A[i]<=10)\),给定\(M\;(1<=M<=10^6)\),求在\(A\)中选奇数个数,满足它们的......
  • ABC264
    ABC264VPABCDEF50:053:3619:0329:0749:1397:20+1rk:\(471st\)perf:\(\color{Blue}{1843}\)Asubser(x,y),输出string类型的\(x\)位......
  • ABC 248 D - Range Count Query(思维)
    https://atcoder.jp/contests/abc248/tasks/abc248_d题目大意:给定一个长度为n的数组a,再给出q次询问;每次询问都问我们区间a[l]~a[r]中k的出现次数是多少?SampleInput......
  • ABC 248 C - Dice Sum(DP:背包)
    https://atcoder.jp/contests/abc248/tasks/abc248_c题目大意:给定长度为n,可选择的数字的范围【1,m】,放置的数字的总和不能超过k;问我们能凑出多少种不同的情况?取模。......