题意

\(Bob\)想解决一个问题:一个\(n\cdot m\)的矩阵,从\((1,1)\)出发,只能走右和下,问从\((1,1)\)到\((n,m)\)的最大\(\&\)和

他的算法如下(\(C++\))

  1. memset(dp, 0, sizeof(dp));
  2. dp[0][1] = a[1][1];
  3. for (int i = 1; i <= n; ++i) {
  4. for (int j = 1; j <= m; ++j) {
  5. dp[i][j] = max(dp[i - 1][j] & a[i][j], dp[i][j - 1] & a[i][j]);
  6. }
  7. }
  8. cout << dp[n][m];

已知他的算法并不能得到最大的\(\&\)和

给定一个\(k\),请构造出一个\(n\cdot m\)的矩阵,使得最大\(\&\)和比他的代码得出的答案大\(k\)

\(1\leq n,m\leq 500\)

\(0\leq a_{i,j}\leq 3\cdot 10^5\)

\(0\leq k\leq 10^5\)

分析

既然要针对\(Bob\)的算法进行构造,那么肯定要知道他的算法错在哪里(知己知彼,百战百胜)

我们将第二个样例的矩阵作为输入,得到\(Bob\)的答案 ,发现是\(2\),在答案路径中,\((3,4)\)前的节点是\((3,3)\)

我们输出\(dp[3][3]\)发现是\(4\),但是在答案路径中,走到\((3,3)\)时是\(3\),大概清楚了\(\&\)和并不能进行贪心

且可以模仿样例在答案路径中放入一个另一个更大的\(\&\)值

我们考虑能否直接构造矩阵使得答案是\(k\),使得\(Bob\)的代码得到\(0\)

首先考虑二维矩阵,发现\((2,2)\)是的确是挑最大的\(\&\)和,无法构造

我们看到第二个样例是\(3\cdot 4\)的矩阵,我们考虑能否构造出一个\(2\*3\)的矩阵

考虑设计两个路径

  • \((1,1)->(1,2)->(2,2)->(2,3)\)
  • \((1,1)->(2,1)->(2,2)->(2,3)\)

通过样例得到灵感,第二条路径得到的\((2,2)\)中的答案比第一条路径中大,但是不满足条件

那么思考如果&\(要大,不妨在\)k\(的二进制前面加上一个\)'1'\(,如果第二条路径要大,可以在\)k\(取反后前面在加一个\)'1'$

我们直接设计\(a[2][3]=k\),我们看数据范围看到\(a[i][j]\)的最大值可以为\(3\cdot k\),考虑如下构造:

将\(k\)变为\(2\)进制,设字符串为\(s\),将其各位取反得到字符串\(s1\)

构造\(2\cdot 3\)矩阵:

\(('1'+s)\) \((s)\) \((0)\)

\(('1'+s1)\) \(('1'+s)\) \((s)\)

然后将其转换为十进制即可

路径一我们可以直接忽略\(s\)前面的\(1\)直接得到答案\(k\)

路径二我们发现走到\((2,2)\)时,答案是\(s\)前面的\(1\),那么这个和\((2,3)\)的值\(\&\)一定是\(0\)

取反也可以用^,但写代码时没考虑那么多

  1. #pragma GCC optimize(3, "Ofast", "inline")
  2. #include <bits/stdc++.h>
  3. #define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  4. #define ll long long
  5. #define int ll
  6. #define ls st<<1
  7. #define rs st<<1|1
  8. #define pii pair<int,int>
  9. #define rep(z, x, y) for(int z=x;z<=y;++z)
  10. #define com bool operator<(const node &b)
  11. using namespace std;
  12. const int maxn = (ll) 3e5 + 5;
  13. const int mod = 998244353;
  14. const int inf = 0x3f3f3f3f;
  15. int k;
  16. int a[30];
  17. signed main() {
  18. start;
  19. cout << 2 << ' ' << 3 << '\n';
  20. cin >> k;
  21. int maxx = 0;
  22. for (int i = 0; i < 30; ++i) {
  23. if (k & (1 << i))
  24. a[i] = 1, maxx = i;
  25. else
  26. a[i] = 0;
  27. }
  28. cout << k + (1 << (maxx + 1)) << ' ' << k << ' ' << 0 << '\n';
  29. int ans = (1 << (maxx + 1));
  30. for (int i = maxx; i >= 0; --i) {
  31. if (!a[i])
  32. ans += (1 << i);
  33. }
  34. cout << ans << ' ' << k + (1 << (maxx + 1));
  35. cout << ' ';
  36. cout << k;
  37. return 0;
  38. }

废话好多,构造还是思路重要,所以大部分篇幅都用来讲思路

CodeForces 1332D Walk on Matrix的更多相关文章

  1. Educational Codeforces Round 40 C. Matrix Walk( 思维)

    Educational Codeforces Round 40 (Rated for Div. 2) C. Matrix Walk time limit per test 1 second memor ...

  2. Codeforces 1332 D. Walk on Matrix(构造矩阵)

    怎么构造呢? \(首先我们不可能去构造一个2000*2000的矩阵,那太复杂了\) \(也许我们可以看看2*2的矩阵??\) \[\left[ \begin{matrix} x&y\\ z&a ...

  3. CodeForces 313C Ilya and Matrix

    Ilya and Matrix Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Su ...

  4. codeforces C. Ilya and Matrix 解题报告

    题目链接:http://codeforces.com/problemset/problem/313/C 题目意思:给定 4n 个整数(可以组成 2n × 2n 大小的矩阵),问通过对这些整数进行排列, ...

  5. codeforces 486B.OR in Matrix 解题报告

    题目链接:http://codeforces.com/problemset/problem/486/B 题目意思:给出一个m行n列的矩阵B(每个元素只由0/1组成),问是否可以利用矩阵B,通过一定的运 ...

  6. Interview-Harry Potter walk through matrix.

    假设你是harry potter,在grid的左上角,你现在要走到右下角,grid中有正数也有负数,遇到正数表示你的strength增加那么多,遇到负数表示strength减少那么多,在任何时刻如果你 ...

  7. Codeforces 903F Clear The Matrix(状态压缩DP)

    题目链接 Clear The Matrix 题意 给定一个$4 * n$的矩形,里面的元素为$'.'$或$'*'$.现在有$4$种正方形可以覆盖掉$'*'$,正方形的边长分别为$1,2,3,4$. 求 ...

  8. Codeforces 903F Clear the Matrix

    题目大意 考虑一个 $4$ 行 $n$ ($4\le n\le 1000$)列的矩阵 $f$,$f$ 中的元素为 * 或 . . 对 $f$ 进行若干次如下变换: 将一个 $k\times k$($1 ...

  9. codeforces 495D Sonya and Matrix

    Since Sonya has just learned the basics of matrices, she decided to play with them a little bit. Son ...

  10. Codeforces 884E E. Binary Matrix

    题 OvO http://codeforces.com/contest/884/problem/E 884e 解 考虑并查集,每个点向上方和左方的点合并,答案即为1的总数减去需要合并的次数 由于只有1 ...

随机推荐

  1. 如何从命令行启动 CST 软件?

    众所周知,CST 一贯以优良的界面友好性而著称,用户可以方便快捷的在其 windows 式的界面下进行建模.仿真及结果查看和处理等操作.然而,在某些特定情况下,也需要 CST 进行后台式的运行,比如需 ...

  2. 新版本,ggplot2 v3.3.0 新特性来袭

    ggplot2 迎来了新的版本,官方宣布了一些新的特性.下面一起看看吧. 1. 轴代码重写 这有利于解决轴标签重叠的情况. 2. 新的 scale bin,它可以像使用 color, fill 一样使 ...

  3. 小技巧 | 使用 mv 重命名文件无需两次键入文件名称

    使用过 Bash 的童鞋都知道 mv 是一个可以用于文件改名的命令,而且使用这个命令修改文件名时我们需要输入两次文件名(旧名字和新名字). 如果有一种情况是只需要你改动文件名中的一个字母,而文件名又特 ...

  4. 看看Angular有啥新玩法!手把手教你在Angular15中集成报表插件

    摘要:本文由葡萄城技术团队于博客园原创并首发.葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. Angular15新特性 Angular框架(以下简称"Angular" ...

  5. 用声明式宏解析 Rust 语法之 enum parser

    上一篇用声明式宏解析 Rust 语法 我们的 "macro parser" 解析了 function 和 struct, 这篇来尝试 parse 一下更复杂的 enum 为什么说 ...

  6. 前台vue发送json格式,后台srpeingboot不能自动处理解决办法

    使用HashMap解决,如下图

  7. 一体化元数据管理平台——OpenMetadata入门宝典

    大家好,我是独孤风,一位曾经的港口煤炭工人,目前在某国企任大数据负责人,公众号大数据流动主理人.在最近的两年的时间里,因为公司的需求,还有大数据的发展趋势所在,我开始学习数据治理的相关知识.今天给大家 ...

  8. 配置http协议访问Harbor镜像仓库

    解决http: server gave HTTP response to HTTPS client问题,此问题在上传与下载时均可能出现. 由于docker镜像拉取与推送服务使用的是https协议,但是 ...

  9. 【Jenkins】 GitLab Gitee GitHub 部署

    Jenkins GitLab Gitee GitHub 部署 环境 Jenkins Git Maven Jenkins 部署可参考文章:https://www.cnblogs.com/cxt618/p ...

  10. MapReduce实现TopN的效果

    1.背景 最近在学习Hadoop的MapReduce,此处记录一下如何实现 TopN 的效果,以及在MapReduce中如何实现 自定义分组. 2.需求 我们有一份数据,数据中存在如下3个字段,订单编 ...