CF-Round #630-div2-D题

11 篇文章 0 订阅
8 篇文章 0 订阅

CF-Round #630-div2-D题

D. Walk on Matrix

传送门

这道题属于构造+思维+位运算。
这道题就很神奇。太考思维了=-=
思维好的话。。三行ac。

题目大意:走一个矩阵,然后每次到达的地方需要进行与运算。题目给出了一种dp算法(先开始我以为是dp题,后来发现。我是想多了把。)
然后dp得出的结论可能不是最大值。
这说明dp对于位运算其实是错误的。
然后给出一个差值k.
让你构造一个矩阵使得最大值-dp出来所获得的值 = k

思路:
我们可以想想让dp出来的值为0,然后矩阵原本的最大值为k。

我们另n为一个比较打的二进制数。(二进制数比较特殊,除了最高位为1,其余均为0)所以这个二进制数与所有比他小的数相与均为0.

我们可以得到下面式子:
n & k = 0;
(n + k) & k = k;
(n + k) & n = n;
k & k = k;
我们需要dp出来的值为0;但原本最大的值为k。
如何构造?? ?
n + k n 0
k n + k k
这个2*3的矩阵可以使得dp出来的值为0.最大值为k
因为dp是每一步取最大值嘛。
所以它的路线是(1,1)-> (1,2)-> (2,2)-> (2,3)
但是获得最大值k的实际路线是:
(1,1)-> (2,1)->(2,2) -> (2,3)

1
代码部分:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int n = 1 << 17;
int k;

int main()
{
	cin >> k;
	cout << "2 3\n";
	cout << n + k << " " << n << " " << 0 << endl;
	cout << k << " " << n + k << " " << k << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

娃娃酱斯密酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值