SMU Summer 2024 Contest Round 4

news/2024/12/29 11:08:44/文章来源:https://www.cnblogs.com/Kescholar/p/18305238

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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/744712.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件设计师

软考官网:http://www.ruankao.org.cn/最近公司提出如果有软件设计师或者系统架构师证(中级、高级)能加一定薪资,所以小鸟~ 最近攻关中级证中,有点空闲顺便整理下相关资料,造福下别人。报考时间2020年,上半年受疫情影响,4月考试调整到下半年11月7、8一起考试,相关报考时…

Autobots应用探索:实践中的思考与发现

背景 背景1:作为一名测试,日常工作中必不可少的几个环节是查看需求文档、编写测试用例、处理线上问题、能力提升等,基于集团的https://xxx.jd.com/工具能一次性帮我们把这些事情都做了; 背景2:作为XXX共建项目的成员之一同时也是第一批用户,我用它做了几个测试实践,和大…

从校招新星到前端技术专家的成长之路

引言 我在2018年校招进入京东,主要负责广告投放系统的前端工作。在京东,这一路走来,我经历了多种角色转换,我从学生到职场人,从校招生到校招导师,从初级前端开发到前端技术专家,也见证了京东广告业务的蓬勃发展。 回顾过去的成长历程,我心中充满了感慨。首先,我要衷心…

达梦数据库DM8-DCP认证专家培训视频

一、介绍 达梦数据库(DMDB)是由中国自主研发的数据库管理系统,它是一款拥有完全自主知识产权的大型关系数据库。达梦数据库支持企业级应用,能够满足不同规模数据处理的需求,尤其在处理大规模数据、高并发访问和高可用性方面表现突出。它兼容国际主流数据库的标准,同时提供…

回溯-排列型

利用哈希表class Solution:def permute(self, nums: List[int]) -> List[List[int]]:ans = []path = []n = len(nums)def dfs(i, s):if i==n:ans.append(path[:])returnfor x in s:path.append(x)dfs(i+1, s-{x})path.pop()dfs(0, set(nums))return ans利用访问数组class So…

Cilium Gateway API 特性(转载)

Cilium Gateway API 特性Cilium Gateway API 特性(转载) 一、环境信息主机 IPubuntu 10.0.0.234软件 版本docker 26.1.4helm v3.15.0-rc.2kind 0.18.0kubernetes 1.23.4ubuntu os Ubuntu 22.04.6 LTSkernel 5.15.0-106二、Cilium Gateway API 流程图Cilium 现在提供完全一致…

Java中的泛型(很细)

非常好,让我们深入探讨Java中的泛型这个重要主题。我将按照之前提供的框架,为您创作一篇全面而专业的技术博客文章。 引言 在Java编程世界中,泛型(Generics)是一个革命性的特性,它彻底改变了我们编写和组织代码的方式。自Java 5引入以来,泛型已成为Java语言不可或缺的一…

祝贺小鹏汽车Gallardot同学成为Apache DolphinScheduler Committer!

社区迎来新committer!这次是来自小鹏汽车的Gallardot,看看他与Apache DolphinScheduler社区的故事吧。对话社区 Q1:您为Apache DolphinScheduler社区提交过哪些贡献(包括代码和非代码)?请具体描述您的贡献。 A: 我主要专注于提升Apache DolphinScheduler在云原生 Kuberne…

zabbix“专家坐诊”第246期问答

问题一 Q:有哪位大哥知道这是啥情况,6.4主动检查接口显示未知?A:看看agent配置文件的主采集有没有填写正确IP。 Q:我刚刚客户端重新授权,发现可以预警了,但是还是灰色的,我尝试输入错误的密码,可以预警,但是这个灰色有点奇怪,在6.0版本上没有这个问题,我现在部署了…

国产数据库:数字时代的科技巨擘

未来,随着技术创新的不断推进和市场需求的持续扩展,国产数据库将继续发挥其重要作用,推动我国信息技术行业的进步和数字经济的蓬勃发展。它们不仅是技术革新的弄潮儿,更是国家信息安全和数字化建设的坚实支柱。国产数据库:技术革新 想象一下,国产数据库就像是一位在信息技…

go sync 与 direct

来自:https://www.qiyacloud.cn/2021/04/2021-04-30/ 写的数据安全吗? 思考一个问题:写数据做到什么程度才叫安全了? 就是:用户发过来一个写 IO 请求,只要你给他回复了 “写成功了”,那么无论机器发生掉电,还是重启等等之类的,数据都还能读出来。 所以,在我们不考虑数…

免费解锁旅游数据新维度:可视化工具让数据说话

随着旅游业的蓬勃发展,海量的数据如同繁星点点,记录着每一位旅者的足迹与偏好。然而,如何将这些复杂的数据转化为直观、易懂的信息,为旅游企业精准决策、为消费者提供更加个性化的服务,成为了行业内外共同关注的焦点。想象一下,当你不再需要埋头于密密麻麻的表格和图表中…