欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CF-Round #630-div2-D题

程序员文章站 2024-02-26 19:53:40
...

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)

CF-Round #630-div2-D题
代码部分:

#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;
}