题意

\(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. JS 数组常用操作全集

    文章目录 1.push()方法 2.unshift()方法 3.pop() 方法 4.shift() 方法 5.filter() 方法 6.join()方法 7. indexOf() 方法 8.rev ...

  2. 非极大值抑制(NMS)算法详解

    NMS(non maximum suppression)即非极大值抑制,广泛应用于传统的特征提取和深度学习的目标检测算法中. NMS原理是通过筛选出局部极大值得到最优解. 在2维边缘提取中体现在提取边 ...

  3. Spring Boot 自动配置一篇概览

    一.什么是自动配置 bean 自动配置类通过添加 @AutoConfiguration 注解实现. 因为 @AutoConfiguration 注解本身是以 @Configuration 注解的,所以 ...

  4. LeetCode 周赛 348(2023/06/05)数位 DP 模板学会了吗

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 加入知识星球提问! 往期回顾:LeetCode 单周赛第 347 场 · 二维空间上的 LIS 最长递增子序列问题 ...

  5. 关于进程、线程、协程的概念以及Java中的应用

    进程.线程.协程 本文将从"操作系统"."Java应用"上两个角度来探究这三者的区别. 一.进程 在我本人的疑惑中,我有以下3个问题. 1.1为什么要引入进程? ...

  6. 基于picker封装的移动端简单实用选择器select插件

    基于picker封装的移动端简单实用选择器select插件; 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12797 效果图如 ...

  7. Spring 中的 Bean

    前言 欢迎来到本篇文章,鸽了好久了,今天继续写下 Spring 的内容:Spring 中 Bean 的基本概念.基本写法和 3 种实例化 Bean 的方式等. 什么是 Bean? 我们回顾下,什么是 ...

  8. XTTS系列之二:不可忽略的BCT

    重要系统Oracle数据库U2L迁移场景中,如果客户来问我建议,我都会回复说首选就是XTTS,除非XTTS经测试实在是无法满足停机窗口,否则就不要考虑OGG这类方案. 换句话说,选择OGG做迁移的场景 ...

  9. Lord Of The Root: 1.0.1实战

    前言 Description:我创建这台机器是为了帮助其他人学习一些基本的CTF黑客策略和一些工具.我瞄准了这台机器,使其在难度上与我在OSCP上破解的机器非常相似. 这是一个引导到根计算机将不需要任 ...

  10. 【IDEA】 远程调试

    远程调试 使用特定JVM参数运行服务端代码 要让远程服务器运行的代码支持远程调试,则启动的时候必须加上特定的JVM参数,这些参数是: -Xdebug -Xrunjdwp:transport=dt_so ...