跳转至

CSP-S 2020 初赛 最优子序列

题面:

img

分析:

这道题目,存在一些疑惑,这和子序列有啥关系,直接全部异或起来,不是最大的吗?

对Max[x][y]的定义,表示当前的子序列下一个位置的高8位是x、最后一个位置的低8位是y时的最大价值。这个定义李,下一个位置的高8位是x,不理解最后一个位置的低8位是y是什么意思,然后第一个数的高8位哪去了?

// 分析代码
#include <iostream>

using namespace std;

typedef long long LL;

const int MAXN = 40000, M = 4, B = M >> 1, MS = (1 << B) - 1;
const LL INF = 1000000000000000LL;

LL Max[MS + 4][MS + 4];

// lower_bit操作
int w(int x) 
{
    int s = x;
    while(x) 
    {
        x ^= x & (x ^ (x - 1));
        s++;
    }
    return s;
}

// 手法专业,赞
void to_max(LL &x, LL y) 
{
    if(x < y)
        x = y;
}

int main() 
{
    int n;
    LL ans = 0;
    cin >> n;

    for(int x = 0; x <= MS; x++)
        for(int y = 0; y <= MS; y++)
            Max[x][y] = -INF;

    cout << B << ' ' << MS << '\n';
    for(int i = 1; i <= n; i++) 
    {
        LL a;
        cin >> a;

        // x是a的高8位,y是低8位
        int x = a >> B, y = a & MS;
        printf("===========x, y: %d %d\n", x, y);

        // 初始化成0
        LL v = 0;

        // 固定高8位,变化低8位,Max[x][z] + w(y ^ z)
        for(int z = 0; z <= MS; z++){
            to_max(v, Max[x][z] + w(y ^ z));
            printf("---%d %d y^z:%d, Max[x][z]:%lld w(y^z):%d 更新v:%lld\n", 
                    x, z, y ^ z, Max[x][z], w(y ^ z), v);
        }

        // 变化高8位,固定低8位,v + w((x ^ z) << B)
        for(int z = 0; z <= MS; z++){
            to_max(Max[z][y], v + w((x ^ z) << B));
            printf("---%d %d x^z:%d, v:%lld + w((x^z)<<B):%d 更新:Max[z][y]%lld\n", 
                    z, y, x^z, v, w((x ^ z) << B), Max[z][y]);
        }

        printf("===========v: %lld\n", v);
        to_max(ans , v);
    }

    cout << ans << endl;

    return 0;
}
// 输入
// 2
// 1  4
// 观察输出

2
2 3
1 
===========x, y: 0 1
---0 0 y^z:1, Max[x][z]:-1000000000000000 w(y^z):2 更新v:0
---0 1 y^z:0, Max[x][z]:-1000000000000000 w(y^z):0 更新v:0
---0 2 y^z:3, Max[x][z]:-1000000000000000 w(y^z):5 更新v:0
---0 3 y^z:2, Max[x][z]:-1000000000000000 w(y^z):3 更新v:0
---0 1 x^z:0, v:0 + w((x^z)<<B):0 更新:Max[z][y]0
---1 1 x^z:1, v:0 + w((x^z)<<B):5 更新:Max[z][y]5
---2 1 x^z:2, v:0 + w((x^z)<<B):9 更新:Max[z][y]9
---3 1 x^z:3, v:0 + w((x^z)<<B):14 更新:Max[z][y]14
===========v: 0
4
===========x, y: 1 0
---1 0 y^z:0, Max[x][z]:-1000000000000000 w(y^z):0 更新v:0
---1 1 y^z:1, Max[x][z]:5 w(y^z):2 更新v:7
---1 2 y^z:2, Max[x][z]:-1000000000000000 w(y^z):3 更新v:7
---1 3 y^z:3, Max[x][z]:-1000000000000000 w(y^z):5 更新v:7
---0 0 x^z:1, v:7 + w((x^z)<<B):5 更新:Max[z][y]12
---1 0 x^z:0, v:7 + w((x^z)<<B):0 更新:Max[z][y]7
---2 0 x^z:3, v:7 + w((x^z)<<B):14 更新:Max[z][y]21
---3 0 x^z:2, v:7 + w((x^z)<<B):9 更新:Max[z][y]16
===========v: 7
7

img

这个题目,先打到这里,做一个备忘,还需要进一步研究。