首页 > 其他分享 >The 2024 CCPC Online Contest

The 2024 CCPC Online Contest

时间:2024-09-18 18:04:22浏览次数:11  
标签:i64 return Contest int CCPC 2024 operator using mint

https://codeforces.com/gym/105336

B - 军训 II

排序后肯定是最优解,方案数就是能排成有序序列的个数

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;
using i128 = __int128;

#define int i64

using vi = vector<int>;
using pii = pair<int, int>;

const int inf = 1e9, INF = 1e18;

const i64 mod = 998244353;

struct mint {
    i64 x;

    mint(i64 x = 0) : x(x) {};

    mint &operator=(i64 o) { return x = o, *this; }

    mint &operator+=(mint o) { return (x += o.x) >= mod && (x -= mod), *this; }

    mint &operator-=(mint o) { return (x -= o.x) < 0 && (x += mod), *this; }

    mint &operator*=(mint o) { return x = (x * o.x) % mod, *this; }

    mint &operator^=(int b) {
        mint w = *this, ret(1);
        for (; b; b >>= 1, w *= w) if (b & 1) ret *= w;
        return x = ret.x, *this;
    }

    mint &operator/=(mint o) { return *this *= (o ^= (mod - 2)); }

    friend mint operator+(mint a, mint b) { return a += b; }

    friend mint operator-(mint a, mint b) { return a -= b; }

    friend mint operator*(mint a, mint b) { return a *= b; }

    friend mint operator/(mint a, mint b) { return a /= b; }

    friend mint operator^(mint a, i64 b) { return a ^= b; }

    i64 val() {
        x = (x % mod + mod) % mod;
        return x;
    }
};


i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int n;
    cin >> n;
    vi a(n);
    for (auto &i: a) cin >> i;
    ranges::sort(a, greater<>());
    int res = 0;
    for (int cnt = n, sum = accumulate(a.begin(), a.end(), 0); auto i: a) {
        cnt--, sum -= i;
        res += cnt * i - sum;
    }
    cout << res;
    vector<mint> fact(n + 1);
    fact[0] = 1;
    for (int i = 1; i <= n; i++)
        fact[i] = fact[i - 1] * i;
    mint ret(2 - (a.back() == a.front()));
    a.push_back(-1);
    for (int lst = -1, cnt = 0; auto i: a) {
        if (lst != i) {
            ret *= fact[cnt], cnt = 1, lst = i;
        } else {
            cnt++;
        }
    }
    cout << " " << ret.val();
    return 0;
}

D - 编码器-解码器

\(f[i][l][r]\)表示\(S_i\)可以匹配\(T[l,r]\)的方案数,然后按照题目的意思进行\(O(N^4)\)的转移就好了。

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;
using i128 = __int128;

#define int i64

using vi = vector<int>;
using pii = pair<int, int>;

const int inf = 1e9, INF = 1e18;

const i64 mod = 998244353;

struct mint {
    i64 x;

    mint(i64 x = 0) : x(x) {};

    mint &operator=(i64 o) { return x = o, *this; }

    mint &operator+=(mint o) { return (x += o.x) >= mod && (x -= mod), *this; }

    mint &operator-=(mint o) { return (x -= o.x) < 0 && (x += mod), *this; }

    mint &operator*=(mint o) { return x = (x * o.x) % mod, *this; }

    mint &operator^=(int b) {
        mint w = *this, ret(1);
        for (; b; b >>= 1, w *= w) if (b & 1) ret *= w;
        return x = ret.x, *this;
    }

    mint &operator/=(mint o) { return *this *= (o ^= (mod - 2)); }

    friend mint operator+(mint a, mint b) { return a += b; }

    friend mint operator-(mint a, mint b) { return a -= b; }

    friend mint operator*(mint a, mint b) { return a *= b; }

    friend mint operator/(mint a, mint b) { return a /= b; }

    friend mint operator^(mint a, i64 b) { return a ^= b; }

    i64 val() {
        x = (x % mod + mod) % mod;
        return x;
    }
};


i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    string s, t;
    cin >> s >> t;
    int n = s.size(), m = t.size();
    vector f(n, vector(m + 1, vector(m + 1, mint())));
    for (int i = 0; i < m; i++)
        if (s[0] == t[i]) f[0][i][i] = 1;
    for (int i = 1; i < n; i++)
        for (int l = 0; l < m; l++)
            for (int r = l; r < m; r++) {
                f[i][l][r] = f[i - 1][l][r] * 2;
                if (l == r) {
                    if (s[i] == t[l]) f[i][l][r] += 1;
                } else {
                    if (s[i] == t[l]) f[i][l][r] += f[i - 1][l + 1][r];
                    if (s[i] == t[r]) f[i][l][r] += f[i - 1][l][r - 1];
                    for (int k = l; k < r; k++)
                        f[i][l][r] += f[i - 1][l][k] * f[i - 1][k + 1][r];
                    for (int k = l + 1; k < r; k++)
                        if (s[i] == t[k])
                            f[i][l][r] += f[i - 1][l][k - 1] * f[i - 1][k + 1][r];
                }
            }

    cout << f[n - 1][0][m - 1].val();

    return 0;
}

E. 随机过程

最大点数就是使得每一层尽可能的填满。

\[\sum \min(n, 26^i) \]

对于期望点数,同一层的点是相互独立的。每层能够出现的点有\(26^i\)种,对于某一种点,被选到的概率就是\(\frac{1}{26^i}\),那么选不到的概率就是\(1 - \frac{1}{26^i}\),我们要选择\(n\)次,\(n\)次都选不到的概率是\((1- \frac{1}{26^i})^ n\),所以这个点被选中的概率就是\(1 - (1- \frac{1}{26^i})^ n\)。这层的点共有\(26^i\)个,因此总的期望就是\(26^i(1 - (1- \frac{1}{26^i})^ n)\),共\(m\)层,所以答案就是

\[\sum 26^i[1 - (1- \frac{1}{26^i})^ n] \]

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using ui32 = uint32_t;
using i64 = long long;

//#define int i64

using vi = vector<int>;
using pii = pair<int, int>;

const i64 mod = 998244353;

struct mint {
    i64 x;

    mint(i64 x = 0) : x(x) {}

    mint &operator=(i64 o) { return x = o, *this; }

    mint &operator+=(mint o) { return (x += o.x) >= mod && (x -= mod), *this; }

    mint &operator-=(mint o) { return (x -= o.x) < 0 && (x += mod), *this; }

    mint &operator*=(mint o) { return x = (i64) x * o.x % mod, *this; }

    inline mint &operator^=(int b) {
        mint w = *this;
        mint ret(1);
        for (; b; b >>= 1, w *= w) if (b & 1) ret *= w;
        return x = ret.x, *this;
    }

    mint &operator/=(mint o) { return *this *= (o ^= (mod - 2)); }

    friend mint operator+(mint a, mint b) { return a += b; }

    friend mint operator-(mint a, mint b) { return a -= b; }

    friend mint operator*(mint a, mint b) { return a *= b; }

    friend mint operator/(mint a, mint b) { return a /= b; }

    friend mint operator^(mint a, int b) { return a ^= b; }

    i64 val() {
        x = (x % mod + mod) % mod;
        return x;
    }
};


i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int n, m;
    cin >> n >> m;

    const mint b(26), one(1);

    mint sum;
    for (int i = 0, x = 1, t = 26; i <= m; i++) {
        sum += x;
        x *= t;
        if (x > n) x = n, t = 1;
    }

    mint res;
    for (int i = 0; i <= m; i++) {
        mint t = b ^ i;
        res += t * (one - ((one - (one / t)) ^ n));
    }

    cout << sum.val() << " " << res.val();
    return 0;
}

J. 找最小

首先我们可以求出原本的异或和\(A,B\),再求出\(c_i = a_i \oplus b_i\)

此时我们就可以考虑用\(c_i\)选择一些数去异或,看能否使得答案减小。

我们贪心的从高位开始操作。

如果当前位\(A,B\)都是\(1\),能操作就操作。

如果当前位都是\(0\),不需要任何操作。

如果当前位的较大数是\(1\),我们可以考虑操作。

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using ui32 = uint32_t;
using i64 = long long;

//#define int i64

using vi = vector<int>;
using pii = pair<int, int>;

#define lowbit(x) ( x & -x )

struct Basis {
    vector<ui32> B;

    Basis() {
        B = vector<ui32>();
    }

    void insert(ui32 x) {
        for (auto b: B)
            x = min(x, b ^ x);
        if (x == 0) return;
        for (auto &b: B)
            b = min(b, b ^ x);
        B.push_back(x);
        return;
    }

    ui32 find(ui32 x) {
        for (auto i: B) {
            int y = i;
            while (lowbit(y) != y) y -= lowbit(y);
            if (x == y) return i;
        }
        return 0;
    }
};

void solve() {
    int n;
    cin >> n;
    vector<ui32> a(n), b(n);
    ui32 A = 0, B = 0;
    for (auto &i: a) cin >> i, A ^= i;
    for (auto &i: b) cin >> i, B ^= i;

    ui32 res = max(A, B);
    Basis basis;
    for (int i = 0; i < n; i++)
        basis.insert(a[i] ^ b[i]);

    for (ui32 i = (1 << 30); i > 0; i >>= 1) {
        if (A < B) swap(A, B);
        if (((A & i) == 0) and ((B & i) == 0)) continue;
        if (A & i) {
            ui32 x = basis.find(i);
            A ^= x, B ^= x;
        }
    }
    res = min(res, max(A, B));
    cout << res << "\n";
    return;
}

i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int T;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

K - 取沙子游戏

这道题目是赛时先写出SG函数,然后找规律发现。

  1. \(n\)为奇数先手必胜,因为只要先手拿\(1\)后手就只能拿\(1\)
  2. \(k \ge n\)先手必胜,因为先手可以一步全部拿完。
  3. 剩下的情况通过找规律发现,对于\(n\)找到最大的\(t\)满足\(t | n\) 且\(t\)为 \(2\)的整次幂,那么\(t \ge k\) 先手必胜

原因赛时没想出来

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;
using i128 = __int128;

#define int i64

using vi = vector<int>;
using pii = pair<int, int>;

const int inf = 1e9, INF = 1e18;

void solve() {
    int n, k;
    cin >> n >> k;
    if (n & 1) {
        cout << "Alice\n";
    } else if (k >= n) {
        cout << "Alice\n";
    } else {
        int p = 1;
        while (n % (p * 2) == 0) p *= 2;
        if (k < p) cout << "Bob\n";
        else cout << "Alice\n";
    }
}

i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int T;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

赛后看了题解,题解总结出来一条规律就是\(\mathrm{lowbit}(n) \le k\)先手必胜。

如果\(\mathrm{lowbit}(n) \le k\),先手可以取一个\(\mathrm {lowbit}(n)\),然后后手一定无法一步取完,这种情况其实和 Nim 博弈很类似。道理上来说我打表找到的规律实际上是殊途同归了

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;
using i128 = __int128;

#define int i64

using vi = vector<int>;
using pii = pair<int, int>;

const int inf = 1e9, INF = 1e18;

#define lowbit(x) ( x & -x )

void solve() {
    int n, k;
    cin >> n >> k;
    if (lowbit(n) > k) cout << "Bob\n";
    else cout << "Alice\n";
    return;
}

i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int T;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

L - 网络预选赛

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;
using i128 = __int128;

#define int i64

using vi = vector<int>;
using pii = pair<int, int>;

const int inf = 1e9, INF = 1e18;

i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    vector<string> g(n);
    for (auto &i: g) cin >> i;
    int res = 0;
    for (int i = 0; i + 1 < n; i++)
        for (int j = 0; j + 1 < m; j++) {
            if (g[i][j] == 'c' and g[i][j + 1] == 'c' and g[i + 1][j] == 'p' and g[i + 1][j + 1] == 'c')
                res++;
        }
    cout << res;
    return 0;
}

标签:i64,return,Contest,int,CCPC,2024,operator,using,mint
From: https://www.cnblogs.com/PHarr/p/18419018

相关文章

  • The 2024 ICPC Asia East Continent Online Contest (I)
    目录写在前面M签到F笛卡尔树or单调栈,dfsorST表,排序A大力讨论,结论G二分答案,前缀和C结论,图论,剩余系,线性代数L图论转化,建图技巧,最短路H括号序列,网络流写在最后写在前面补题地址:https://codeforces.com/contest/2005。以下按个人难度向排序。复刻CCPC网赛开头超顺利......
  • 2024版PyCharm安装详细教程!(附安装包)
    Python简介Python是一种计算机程序设计语言,它结合了解释性、编译性、互动性和面向对象的脚本语言,非常简单易用。Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。很多著名的网站都是用它编写的,如豆......
  • 2024年最强网络安全学习路线,详细到直接上清华的教材!
     关键词:网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线首先咱们聊聊,学习网络安全方向通常会有哪些问题前排提示:文末有CSDN官方认证Python入门资料包!1、打基础时间太长学基础花费很长时间,光语言都有几门,有些人会倒在学习linux系统及命令的路上,更多的人会倒......
  • 2024-09-18:用go语言,给定一个从 0 开始的长度为 n 的正整数数组 nums 和一个二维操作数
    2024-09-18:用go语言,给定一个从0开始的长度为n的正整数数组nums和一个二维操作数组queries,每个操作由一个下标值indexi和一个数值ki组成。开始时,数组中的所有元素都是未标记的。依次执行m次操作,每次操作的过程如下:1.如果下标indexi对应的元素还未标记,则标记这个元素......
  • EUNOIA BY AN - 越南品牌在2024中国国际时装周-北京闪耀
    2024年9月9日讯、EunoiabyAN—一个专门为儿童设计的高端礼服的品牌、在2024年中国国际时装周上精彩亮相。该品牌以其富有民族特色的设计、成为第一个在中国国际时装周展示的越南儿童时尚品牌。此次出席活动有越南驻中国大使馆代表——NguyenTruongSon先生。近年来、儿......
  • Adobe Illustrator AI2024下载安装(附win/mac安装包)
    目录一、AdobeAI下载二、系统要求一、AdobeAI下载链接:https://pan.baidu.com/s/11IMuW59pfaLS8mbzWdlOig?pwd=dgys提取码:dgys二、系统要求为了确保AdobeIllustrator能够正常运行并发挥最佳性能,您的计算机系统需要满足以下要求:1.操作系统Windows:Windows10(......
  • 刘德华2024演唱会危险事故集锦
    分析2024年刘德华演唱会事故2024年,刘德华的演唱会巡回演出中接连发生了多起事故,这些事件不仅让人们担心他的身体状况,也引发了对演唱会团队安全管理的质疑。上海站高台滑跪事故(7月5日)在上海的演唱会上,刘德华进行了一个高台滑跪的动作。滑跪本身是一个极具视觉冲击力的表演动作,尤其是......
  • The 2022 ICPC Asia Xian Regional Contest
    目录写在前面F签到J签到C贪心,模拟G字符串,哈希L贪心,结论E数学,模拟B结论,网络流ALCTor根号预处理or线段树分治维护连通性D倍增,DP写在最后写在前面比赛地址:https://codeforces.com/gym/104077。以下按个人向难度排序。vp8题900+罚时差100罚时金。唉唉现在题数......
  • 2024-03-01 Windows MySQL5.7.27绿色版安装
    背景MySQL是常用数据库,其中版本已经有很多了,安装方式也有很多,联网装、安装包等。不仅安装麻烦,卸载也很麻烦。因此笔者一般都是使用绿色版安装,安装过程自己很清晰,每一步都知道自己做了什么,卸载时也很容易,自己安装的时候做了什么,卸载的时候删除什么就行了。版本MySQL版本很多,而......
  • 【An2024】电脑动画程序软件下载安装(附Adobe Animate安装包)
    简介AdobeAN软件,全称AdobeAnimate,是由AdobeSystems开发的一款功能强大的多媒体创作和电脑动画程序。这款软件以其专业性和易用性在动画制作、广告制作、游戏开发以及多媒体内容创作等多个领域得到了广泛应用。以下是对AdobeAN软件的简介,包括其主要功能和操作方法: 下载......