首页 > 其他分享 >SMU Summer 2024 Contest Round 4

SMU Summer 2024 Contest Round 4

时间:2024-07-16 14:56:43浏览次数:15  
标签:Summer int SMU cin long 2024 using i64 dp

SMU Summer 2024 Contest Round 4

Made Up

题意

给你三个序列 \(A,B,C\) ,问你满足 \(A_i = B_{C_j}\) 的 \((i,j)\) 对有多少。

思路

由于 \(1\le A_i,B_i,C_i\le N\) ,所以可以统计 \(Cnt[A_i]\) 和 \(Cnt[B_{C_i}]\) 的个数,两者相乘累加即可。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    vector<int> a(n), b(n), c(n);

    vector<i64> cnta(n + 1);
    for (auto &i : a) {
        cin >> i;
        cnta[i] ++;
    }

    for (auto &i : b)
        cin >> i;

    vector<i64> cntb(n + 1);
    for (auto &i : c) {
        cin >> i;
        cntb[b[--i]] ++;
    }

    i64 ans = 0;
    for (int i = 1; i <= n; i ++) {
        ans += cnta[i] * cntb[i];
    }

    cout << ans << '\n';

    return 0;
}

H and V

题意

给你 \(H\times W\) 的只包含.#的矩阵, 你可以选择任意行任意列改成.,问你修改后使得矩阵中#的个数等于 k 的方案有多少种。

思路

因为 \(1\le H,W\le 6\),所以直接对边和列枚举改哪些行和列即可。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int h, w, k;
    cin >> h >> w >> k;

    vector<string> s(h);
    for (auto &i : s)
        cin >> i;

    auto calc = [](vector<string> ss) {
        int res = 0;
        for (auto i : ss)
            for (auto c : i)
                res += (c == '#');
        return res;
    };

    int ans = 0;
    for (int i = 0; i < (1 << h); i ++) {
        for (int j = 0; j < (1 << w); j ++) {
            auto S = s;
            for (int k = 0; k < h; k ++)
                if ((i >> k) & 1)
                    S[k] = string(w, '.');
            for (int k = 0; k < w; k ++)
                if ((j >> k) & 1) {
                    for (int p = 0; p < h; p ++)
                        S[p][k] = '.';
                }

            if (calc(S) == k)
                ans ++;
        }
    }

    cout << ans << '\n';

    return 0;
}

Moving Piece

题意

给你 n 个点,然后每个点 可以到达其他第 \(P_i\) 个点,到达下个点后可以获得对应的 \(C_i\) 分数,你可以选择某个点为起始点走 \(K\) 步,起始点的分数不计,问你最大能获得多少分。

思路

因为每个点只有一个方向,所以将它们抽象成图以后就是多个环,而你需要在这些环上找一个环走 \(K\) 步。

当走的步数大于环上的点数时,直接计算一下会经过多少次这个环,乘以环的总分数即可。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, k;
    cin >> n >> k;

    vector<int> p(n + 1);
    for (int i = 1; i <= n; i ++)
        cin >> p[i];

    vector<int> C(n + 1);
    for (int i = 1; i <= n; i ++)
        cin >> C[i];

    i64 ans = INT_MIN;
    for (int i = 1; i <= n; i ++) {
        i64 to = i, sum = 0;
        vector<i64> path;
        while (true) {
            to = p[to];
            sum += C[to];
            path.push_back(sum);
            if (to == i) break;
        }

        const int dis = path.size();
        for (int j = 0; j < dis && j < k; j ++) {
            int CircleNum = (k - 1 - j) / dis;
            ans = max(ans, path[j]);
            if(CircleNum > 0)
                ans = max(ans, path[j] + CircleNum * sum);
        }
    }

    cout << ans << '\n';

    return 0;
}

Sum of Divisors

题意

设 \(f(X)\) 为 \(X\) 的所有因子数,求 \(\sum_{K=1}^NK\times f(K)\)。

思路

考虑一个数产生的贡献。

对于一个数,它只会在它的倍数中产生贡献,例如,2 只会在 \(2,4,6,8,10\dots\) 中产生贡献,而在上界为 \(N\) 的情况下只会有 \(\frac{N}{i}\) 个 \(i\) 的倍数,而对于 2 而言,它在 2 中产生的贡献为 2,在4 中的产生的贡献为 4,在 6 中产生的贡献为 6,\(\dots\),其他数同理,观察可得一个数产生的贡献为 \(i + 2i+3i+4i+\dots\),没错,这就是一个首项为 \(i\) ,公差为 \(i\),项数为 \(\frac{N}{i}\),末项为 \(\lfloor\frac{N}{i}\rfloor\times i\) 的等差数列,所以从 1 到 n 累加求和即可。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    i64 ans = 0;
    for(int i = 1;i <= n;i ++){
        i64 d = i, a1 = i, len = n / i, an = d * len;
        ans += len * (a1 + an) / 2;
    }

    cout << ans << '\n';

    return 0;
}

Red and Green Apples

题意

给你三个序列 \(A,B,C\),\(C\) 序列中的任何数可以替换 \(A,B\) 中的任何数,你要选出 A 中 X 个,B 中 Y 个,求它们的和最大。

思路

将 A,B 排序后取前 X 个和前 Y 个放入 C 中,再将 C 排序,取出前 X+Y 个即可。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int x, y, a, b, c;
    cin >> x >> y >> a >> b >> c;

    vector<int> A(a), B(b), C(c);
    for (auto &i : A)
        cin >> i;

    for (auto &i : B)
        cin >> i;

    for (auto &i : C)
        cin >> i;

    sort(A.begin(), A.end(), greater<>());
    sort(B.begin(), B.end(), greater<>());

    for(int i = 0;i < x;i ++)
        C.push_back(A[i]);

    for(int i = 0;i < y;i ++)
        C.push_back(B[i]);

    sort(C.begin(),C.end(),greater<>());

    i64 ans = 0;
    for(int i = 0;i < x + y;i ++)
        ans += C[i];

    cout << ans << '\n';

    return 0;
}

Rem of Sum is Num

题意

给你序列 A,求 A 中连续子序列之和模 K 后等于该子序列中元素数量的连续子序列数量。

思路

转化题意,即求:

\[\sum_{i=1}^{n}\sum_{j=i}^n[\sum_{k=i}^jA_k\bmod k=i-j] \]

复杂度\(O(n^3)\),显然超时。

考虑优化,前缀和优化即:

\[(sum_i-sumj)\bmod k = i-j\\ \]

\[((sum_i-sum_j)-(i-j))\bmod k = 0\\ \]

\[(sum_i-i)\bmod k=(sum_j-j)\bmod k \]

至此,这道题就变成了求区间长度最大为 k 的 满足以上条件的方案数,在模 k 后其区间元素数量最多为 k ,否则就不满足条件,超过区间长度需减掉。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    i64 n, k;
    cin >> n >> k;

    vector<i64> a(n + 1), pre(n + 1);
    for (int i = 1; i <= n; i ++) {
        cin >> a[i];
        pre[i] = pre[i - 1] + a[i];
    }

    for (int i = 1; i <= n; i ++) {
        pre[i] = (pre[i] - i) % k;
    }

    i64 ans = 0;
    int len = min(k-1, n);
    map<i64, i64> mp;

    for (int i = 0; i <= n; i ++) {
        if (i > len) mp[pre[i - k]]--;
        ans += mp[pre[i]];
        mp[pre[i]] ++;
    }

    cout << ans << '\n';

    return 0;
}

Keep Connect

题意

给定 $ n, p $,存在如图的 $ 2 \times n $ 的网格图,显然初始共有 $ 2n $ 个顶点和 $ 3n - 2 $ 条边,分别求删除 $ i \in [1, n - 1] $ 条边后仍使图连通的删边方案数,对 $ p $ 取模。

思路

将上下的两个点看成一列,考虑 dp。

设 \(dp_{i,j,0/1}\) 为前 i 列中删掉 j 条边是否连通的方案数。

首先假设第 i 列连通:

  • 那么会有四种情况使得第 i+1 列连通:

    • 前三种:imageimageimage
      得出转移方程为 \(dp_{i+1,j+1,1} += dp_{i,j,1}\times 3\)

    • 第四种:image

      得出转移方程为 \(dp_{i+1,j,1}+=dp_{i,j,1}\)

  • 会有两种情况使得第 i+1 列无法连通:

    image

    image

    得出转移方程为 \(dp_{i+1,j+2,0}+=dp_{i,j,1}\times 2\)

假设第 i 列不连通:

  • 使得第 i+1 列连通:

    image

    得出转移方程为 \(dp_{i+1,j,1}+=dp_{i,j,0}\)

  • 使得第 i+1 列不连通:

    image

    得出转移方程为 \(dp_{i+1,j+1,0}+=dp_{i,j,0}\)

另外还有些减去三边的情况,但是那种情况产生后后面都不可能再连通,对答案无贡献。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

const int N = 3e3 + 10;
i64 dp[N][N][2];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    i64 n, p;
    cin >> n >> p;

    dp[1][0][1] = dp[1][1][0] = 1;
    for (int i = 1; i <= n; i ++) {
        for (int j = 0; j < n; j ++) {
            dp[i + 1][j + 1][1] = (dp[i + 1][j + 1][1] + dp[i][j][1] * 3) % p;
            dp[i + 1][j][1] = (dp[i + 1][j][1] + dp[i][j][1]) % p;
            dp[i + 1][j + 2][0] = (dp[i + 1][j + 2][0] + dp[i][j][1] * 2) % p;
            dp[i + 1][j][1] = (dp[i + 1][j][1] + dp[i][j][0]) % p;
            dp[i + 1][j + 1][0] = (dp[i + 1][j + 1][0] + dp[i][j][0]) % p;
        }
    }

    for (int i = 1; i < n; i ++)
        cout << dp[n][i][1] << " \n"[i == n - 1];

    return 0;
}

标签:Summer,int,SMU,cin,long,2024,using,i64,dp
From: https://www.cnblogs.com/Kescholar/p/18305238

相关文章

  • 2024-07-16 记录vue内置组件(ps:内容来自GPT)
    1. Transition和TransitionGroup用途:用于为单个元素或组件提供过渡效果。TransitionGroup则用于列表中的多个元素或组件的过渡效果。特点:Transition:只影响单个元素或组件,不会额外渲染DOM元素。TransitionGroup:渲染一个真实的DOM元素(默认为<span>),可以通过tag属性改变渲染......
  • 2024年7月JLPT日语N2真题试卷、答案解析、听力原文
    本套真题由【学日语的師夫】制作排版,分享下载日语等级考试N1N2N3N4N5专四专八历年真题PDF文件,树先生日语真题的平替内容,精讲版答案解析非常适合复习备考,听力原文真是还原听力场景,多听多练习。如果你正在备考12月份的考试,可以参考【学日语的師夫】排版的真题内容,刷真题是最有效......
  • 【2024】springboot校服订购系统设计与实现
     博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大......
  • StableDiffusion 安装部署教程,轻松上手无压力!(附2024最新SD安装包)
    亲爱的小伙伴们,大家好!今天要给大家分享一个超级实用的SD安装教程,让您轻松开启新的体验之旅!一、SD简介SD是一款功能强大且备受欢迎的软件/工具,它具有的以下功能和优势,能够为您的工作、学习和娱乐带来极大的便利。功能:1.文生图创作-根据输入的文本描述生成逼真或......
  • 【AI资讯早报】AI科技前沿资讯概览:2024年7月16日早报
    【AI资讯早报】AI科技前沿资讯概览,涵盖了行业大会、技术创新、应用场景、行业动态等多个方面,全面展现了AI领域的最新发展动态和未来趋势。1.人工智能标准化体系加速构建工业和信息化部等四部门联合发布了《国家人工智能产业综合标准化体系建设指南(2024版)》,旨在到2026年新......
  • 2024 0713 zstu 月赛M - Packmen
    游戏场地是一条由1 × n个方格单元组成的带状区域。一些单元格中有吃豆人,一些单元格中有星号,其他单元格为空。吃豆人可以在1时间单位内移动到相邻的单元格。如果目标单元格中有星号,吃豆人会吃掉它。吃豆人吃星号不需要花费任何时间。在初始时刻,所有吃豆人开始移动。每个吃豆人......
  • 2024最新的源代码防泄漏方案分享
    源代码是软件开发的核心资产,一旦泄露,不仅会导致知识产权损失,还可能被竞争对手利用,给企业带来巨大的经济损失和法律风险。那么有没有针对源代码的防泄漏方案呢?接下来我为大家介绍2024最新的源代码防泄漏解决方案。1.访问控制:实施严格的访问控制策略,确保只有授权的开发者和......
  • 【2024-07-15】欠债人生
    23:59如果你在这世上、在你自身之外去寻找幸福,那任何东西都不会有幸福的影子。对于幸福,我们既不能争论,也无法预测,此时此刻拥有的幸福才是幸福。如果幸福看似还在未来,那就停下来想一想,因为你已经拥有它了。有希望就是一种幸福。                ......
  • 2024开放式耳机品牌榜,小白可以直入的五款蓝牙耳机!
    在选择适合散步聊天和听歌的耳机时,开放式耳机确实是一个值得考虑的选项。与传统的入耳式耳机相比,开放式耳机最大的优势在于它们不会完全封闭耳道,因此用户在享受音乐的同时,仍能保持对周围环境的感知,这对于户外活动尤其重要,因为它可以提高安全性,让你在散步或跑步时能够听到交通声......
  • 2024年度上半年中国汽车保值率报告
    来源:中国汽车流通协会&精真估近期历史回顾:2024上半年房地产企业数智化转型报告.pdf2024国产院线电影路演数据洞察报告.pdf空间数据智能大模型研究-2024年中国空间数据智能战略发展白皮书.pdf2024年全球资产管理报告2024年中型律师事务所的法律趋势.pdf2024年数字经济报......