题意

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

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

    memset(dp, 0, sizeof(dp));
dp[0][1] = a[1][1];
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
dp[i][j] = max(dp[i - 1][j] & a[i][j], dp[i][j - 1] & a[i][j]);
}
}
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\)

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

#pragma GCC optimize(3, "Ofast", "inline")

#include <bits/stdc++.h>

#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define int ll
#define ls st<<1
#define rs st<<1|1
#define pii pair<int,int>
#define rep(z, x, y) for(int z=x;z<=y;++z)
#define com bool operator<(const node &b)
using namespace std;
const int maxn = (ll) 3e5 + 5;
const int mod = 998244353;
const int inf = 0x3f3f3f3f;
int k;
int a[30]; signed main() {
start;
cout << 2 << ' ' << 3 << '\n';
cin >> k;
int maxx = 0;
for (int i = 0; i < 30; ++i) {
if (k & (1 << i))
a[i] = 1, maxx = i;
else
a[i] = 0;
}
cout << k + (1 << (maxx + 1)) << ' ' << k << ' ' << 0 << '\n';
int ans = (1 << (maxx + 1));
for (int i = maxx; i >= 0; --i) {
if (!a[i])
ans += (1 << i);
}
cout << ans << ' ' << k + (1 << (maxx + 1));
cout << ' ';
cout << k;
return 0;
}

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

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. Java程序设计复习提纲(下:图形界面)

    目录 上:Java程序设计复习提纲(上:入门语法) - 孤飞 - 博客园 (cnblogs.com) 基本语法与编译运行 数据类型和关键字 常用语法 数组与字符串 异常处理 中:Java程序设计复习提 ...

  2. ODOO13之12:Odoo 13开发之报表和服务端 QWeb

    报表是业务应用非常有价值的功能,内置的 QWeb 引擎是报表的默认引擎.使用 QWeb 模板设计的报表可生成 HTML 文件并被转化成 PDF.也就是说我们可以很便捷地利用已学习的 QWeb 知识,应 ...

  3. 手摸手带你 在Windows系统中安装Istio

    Istio简介 通过负载均衡.服务间的身份验证.监控等方法,Istio 可以轻松地创建一个已经部署了服务的网络,而服务的代码只需很少更改甚至无需更改. 通过在整个环境中部署一个特殊的 sidecar ...

  4. JavaWeb编程面试题——Spring Framework

    引言 面试题==知识点,这里所记录的面试题并不针对于面试者,而是将这些面试题作为技能知识点来看待.不以刷题进大厂为目的,而是以学习为目的.这里的知识点会持续更新,目录也会随时进行调整. 关注公众号:编 ...

  5. WPF中小的技能点 1

    图片圆角的处理方式       采用boder里background背景设置图片并设置对应的圆角 <Border CornerRadius="20">      < ...

  6. MySQL中都有哪些锁?

    MySQL中都有哪些锁 为什么需要锁 在计算机系统中,锁(Lock)是一种同步机制,用于控制对共享资源的访问.它确保在任何给定时间内只有一个线程能够访问受保护的共享资源,从而避免了由并发访问导致的数据 ...

  7. Paimon读取流程

    查询模式 先来看看官网关于Paimon查询模式的说明 可以看到查询模式围绕snapshot展开, 而snapshot分了两种一种是Last compact snapshot和 last snapsho ...

  8. 从零开始整SpringBoot-工具与插件

    工具 工具 名称 地址 IDEA https://www.jetbrains.com/idea/ JDK1.8 https://www.oracle.com/java/technologies/jav ...

  9. 运行C时报错:relocation truncated to fit: R_X86_64_PC32 against undefined symbol `WinMain‘ collect2: error

    写C时,遇到报错 [Running] cd "d:\考研\408\LeranC\Code\GramForC\" && gcc 01data_types.c -o 0 ...

  10. 学习C++这一篇就够了(提升篇)

    C++中除了面向对象的编程思想外,还有另一种就是泛型编程 主要用到的技术就是模板 模板机制的分类: 函数模板 类模板 函数模板 作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体定制,用虚拟 ...