加加又赛赛

相信大家都听说过 5k 保龄了,那么 5k 保龄了是怎么回事呢?其实 5k 保龄了是因为他是唐氏儿,对拍之后把 freopen 删掉了,小编也很惊讶,但事实就是这样。大家对 5k 保龄了还有什么看法,欢迎在评论区与小编讨论哦~

A

考虑贪心,每个月把能买的钻石全买下来,最后把多余的“退掉”(视为当时没买)。

维护 \(p_i\) 表示当前手上有几个通过第 \(i\) 种购买方案买到的钻石,则每过一个月 \(p_i\gets p_i+b_i\)

考虑第 \(i\) 个月花费手上的哪 \(c_i\) 个钻石。最后退掉的钻石价值和越大越好,所以这里花费的 \(c_i\) 个钻石要取价值最小的前 \(c_i\) 个。

线段树维护 \(p\) 即可。

B

把所有字符串排序,\(a\) 排在 \(b\) 前面当且仅当 \(a+b<b+a\)

用分讨或者别的什么方法容易证明这是偏序。

C

Nim-K 博弈:有 \(n\) 堆石子,两人轮流从 \(1\sim k\) 堆石子中拿走若干个,无法操作者输。

结论:把每堆石子的数量的二进制表示 \((a_1a_2\dots a_m)_2\)\(k+1\) 进制下做不进位加法(下文称“异或”),结果非 \(0\) 则先手必胜。

证明参考原版 Nim 游戏,还是比较简单的。

不能让绿龙选出一个“异或”和为 0 的子集,也就是说选出的人的 \(x\) 值需要线性无关。

则问题转化为选出一个子集使得 \(x\) 值线性无关且 \(y\) 值之和最大,线性基维护即可。

朴素实现难以通过,维护三进制向量时可以维护 0、1、2 的位置集合的状压值,少一个 $\log $。

顶针要代码,那就放一下代码:

#include <cstdio>
#include <algorithm>
#define int long long
using namespace std;
int n, q;
struct S
{
    int p0, p1, p2, v;
    int operator[](int x) { return p0 >> x & 1 ? 0 : p1 >> x & 1 ? 1 : 2; }
    S operator*(int k) { return k == 1 ? S{p0, p1, p2, v} : S{p0, p2, p1, v}; }
    S operator-(S b) { return S{p0 & b.p0 | p1 & b.p1 | p2 & b.p2, p1 & b.p0 | p2 & b.p1 | p0 & b.p2, p2 & b.p0 | p0 & b.p1 | p1 & b.p2, v}; }
} p[150];
void I(S u)
{
    for (int i = 60; i >= 0; --i)
        if (u[i])
        {
            if (!p[i][i])
            {
                p[i] = u, q += u.v;
                return;
            }
            if (u.v > p[i].v)
                q += u.v - p[i].v, swap(p[i], u);
            u = u - p[i] * (u[i] * p[i][i] % 3);
        }
}
signed main()
{
    freopen("a.in", "r", stdin);
    freopen("a.out", "w", stdout);
    scanf("%lld", &n);
    for (int i = 1, x, y, _ = 0; i <= n; ++i)
    {
        scanf("%lld%lld", &x, &y), x ^= _;
        S u = {0, 0, 0};
        for (int i = 0; i <= 60; ++i)
            if (x >> i & 1)
                u.p1 |= 1ll << i;
            else
                u.p0 |= 1ll << i;
        u.v = y, I(u);
        printf("%lld\n", _ = q);
    }
    return 0;
}

“异或”的引号的作用是什么?

posted @ 2024-09-15 12:18  5k_sync_closer  阅读(157)  评论(9编辑  收藏  举报