CodeForces 1332D - Walk on Matrix【构造】

题意:

构造一个矩阵,使得从左上角到右下角实际的最大值比题目提供的 \(dp\) 方法大 \(k\)

分析:

使得 \(dp\) 所求出的最大值为 \(0\),实际最大值为 \(k\)
对于矩阵:

\[ \left[ \begin{matrix} a_{1,1} & a_{1,2} \\ a_{2,1} & a_{2,2} \end{matrix} \right] \]

按照题目给的 \(dp\) 的做法,
\(a_{2,2}=max\{a_{1,1}\&a_{1,2}\&a_{2,2}\ ,\ a_{1,1}\&a_{2,1}\&a_{2,2}\}\)
构造矩阵:

\[ \left[ \begin{matrix} x \bigoplus k & x \\ k & x \bigoplus k \end{matrix} \right] \]

有:\(a_{2,2}=max\{(x \bigoplus k)\&x,(x \bigoplus k)\&k \}\)
又因为有:\((x \bigoplus k)\&x \&k=0\)
在原有矩阵的基础上进行修改:

\[ \left[ \begin{matrix} x \bigoplus k & x & 0\\ k & x \bigoplus k & k \end{matrix} \right] \]

所以我们要使的 \((x \bigoplus k)\&x > (x \bigoplus k)\&k\),才能保证按 \(dp\) 做法求出的结果为 \(0\)
那么 \(x\) 的取值就很关键。\(x\) 应该取比 \(k_{max}\) 大且为 \(2\) 的整数次幂,如 \(2^{17}\)
所以 \(dp\) 取得的最大值为 \((x \bigoplus k)\&x \&k=0\)
实际最大值为 \((x^k)\&k=k\)
最终矩阵为:

扫描二维码关注公众号,回复: 10505473 查看本文章

\[ \left[ \begin{matrix} 2^{17} \bigoplus k & 2^{17} & 0\\ k & 2^{17} \bigoplus k & k \end{matrix} \right] \]

代码:

C++:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int k;
    scanf("%d",&k);
    printf("2 3\n");
    int x=1<<17;
    printf("%d %d %d\n",x^k,x,0);
    printf("%d %d %d\n",k,x^k,k);
    return 0;
}

python:

k=int(input())
print("2 3\n")
x=1<<17
print(x^k,x,0)
print(k,x^k,k)

猜你喜欢

转载自www.cnblogs.com/1024-xzx/p/12637820.html