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)
代码部分:
#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;
}
上一篇: Java延迟队列原理与用法实例详解