CodeForces 1332D Walk on Matrix
题意
\(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的更多相关文章
- 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 ...
- Codeforces 1332 D. Walk on Matrix(构造矩阵)
怎么构造呢? \(首先我们不可能去构造一个2000*2000的矩阵,那太复杂了\) \(也许我们可以看看2*2的矩阵??\) \[\left[ \begin{matrix} x&y\\ z&a ...
- CodeForces 313C Ilya and Matrix
Ilya and Matrix Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Su ...
- codeforces C. Ilya and Matrix 解题报告
题目链接:http://codeforces.com/problemset/problem/313/C 题目意思:给定 4n 个整数(可以组成 2n × 2n 大小的矩阵),问通过对这些整数进行排列, ...
- codeforces 486B.OR in Matrix 解题报告
题目链接:http://codeforces.com/problemset/problem/486/B 题目意思:给出一个m行n列的矩阵B(每个元素只由0/1组成),问是否可以利用矩阵B,通过一定的运 ...
- Interview-Harry Potter walk through matrix.
假设你是harry potter,在grid的左上角,你现在要走到右下角,grid中有正数也有负数,遇到正数表示你的strength增加那么多,遇到负数表示strength减少那么多,在任何时刻如果你 ...
- Codeforces 903F Clear The Matrix(状态压缩DP)
题目链接 Clear The Matrix 题意 给定一个$4 * n$的矩形,里面的元素为$'.'$或$'*'$.现在有$4$种正方形可以覆盖掉$'*'$,正方形的边长分别为$1,2,3,4$. 求 ...
- Codeforces 903F Clear the Matrix
题目大意 考虑一个 $4$ 行 $n$ ($4\le n\le 1000$)列的矩阵 $f$,$f$ 中的元素为 * 或 . . 对 $f$ 进行若干次如下变换: 将一个 $k\times k$($1 ...
- codeforces 495D Sonya and Matrix
Since Sonya has just learned the basics of matrices, she decided to play with them a little bit. Son ...
- Codeforces 884E E. Binary Matrix
题 OvO http://codeforces.com/contest/884/problem/E 884e 解 考虑并查集,每个点向上方和左方的点合并,答案即为1的总数减去需要合并的次数 由于只有1 ...
随机推荐
- 如何从命令行启动 CST 软件?
众所周知,CST 一贯以优良的界面友好性而著称,用户可以方便快捷的在其 windows 式的界面下进行建模.仿真及结果查看和处理等操作.然而,在某些特定情况下,也需要 CST 进行后台式的运行,比如需 ...
- 新版本,ggplot2 v3.3.0 新特性来袭
ggplot2 迎来了新的版本,官方宣布了一些新的特性.下面一起看看吧. 1. 轴代码重写 这有利于解决轴标签重叠的情况. 2. 新的 scale bin,它可以像使用 color, fill 一样使 ...
- 小技巧 | 使用 mv 重命名文件无需两次键入文件名称
使用过 Bash 的童鞋都知道 mv 是一个可以用于文件改名的命令,而且使用这个命令修改文件名时我们需要输入两次文件名(旧名字和新名字). 如果有一种情况是只需要你改动文件名中的一个字母,而文件名又特 ...
- 看看Angular有啥新玩法!手把手教你在Angular15中集成报表插件
摘要:本文由葡萄城技术团队于博客园原创并首发.葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. Angular15新特性 Angular框架(以下简称"Angular" ...
- 用声明式宏解析 Rust 语法之 enum parser
上一篇用声明式宏解析 Rust 语法 我们的 "macro parser" 解析了 function 和 struct, 这篇来尝试 parse 一下更复杂的 enum 为什么说 ...
- 前台vue发送json格式,后台srpeingboot不能自动处理解决办法
使用HashMap解决,如下图
- 一体化元数据管理平台——OpenMetadata入门宝典
大家好,我是独孤风,一位曾经的港口煤炭工人,目前在某国企任大数据负责人,公众号大数据流动主理人.在最近的两年的时间里,因为公司的需求,还有大数据的发展趋势所在,我开始学习数据治理的相关知识.今天给大家 ...
- 配置http协议访问Harbor镜像仓库
解决http: server gave HTTP response to HTTPS client问题,此问题在上传与下载时均可能出现. 由于docker镜像拉取与推送服务使用的是https协议,但是 ...
- 【Jenkins】 GitLab Gitee GitHub 部署
Jenkins GitLab Gitee GitHub 部署 环境 Jenkins Git Maven Jenkins 部署可参考文章:https://www.cnblogs.com/cxt618/p ...
- MapReduce实现TopN的效果
1.背景 最近在学习Hadoop的MapReduce,此处记录一下如何实现 TopN 的效果,以及在MapReduce中如何实现 自定义分组. 2.需求 我们有一份数据,数据中存在如下3个字段,订单编 ...