Codeforces Round 998 (Div. 3)

news/2025/1/20 1:12:27/文章来源:https://www.cnblogs.com/maburb/p/18680601

A. Fibonacciness

题意:给你\(a_1,a_2,a_4,a_5\),你可以让\(a_3\)等于任何数,求最大有多少个\(i\)满足\(1 <= i <= 3, a_i + a_{i+1} = a_{i+2}\)

枚举\(a_3\)分别等于\(a_1 + a_2,a_4 - a_2, a_5 - a_4\)的情况取最大值即可。

点击查看代码
void solve() {int a, b, c, d;std::cin >> a >> b >> c >> d;int ans1 = 1;if (b + a + b == c) {++ ans1;}if (a + b + c == d) {++ ans1;}int ans2 = 1;if (b + d - c == c) {++ ans2;}if (a + b == d - c) {++ ans2;}int ans3 = 1;if (a + b == c - b) {++ ans3;}if (c - b + c == d) {++ ans3;}std::cout << std::max({ans1, ans2, ans3}) << "\n";
}

B. Farmer John's Card Game

题意:\(n \times m\)个牌分在\(n\)个人手里,每人手里\(m\)个,要有一个排列使得按照这个排列上的顺序出牌,让所有人都可以出完,出牌规则是要等于上一个人出的牌。

要出完所有牌,那么打出的牌肯定是\(n*m\)个牌按从小到大顺序出。那么从小到大枚举,看当前出这个牌的人上次出牌是不是在\(i-n\)之前就行,因为一轮是\(n\)个人,总共\(m\)轮正好出完,所以一个人如果在一轮出两张以上的牌那么会有一个人有牌出不来。

点击查看代码
void solve() {int n, m;std::cin >> n >> m;std::vector<int> a(n * m);for (int i = 0; i < n; ++ i) {for (int j = 0; j < m; ++ j) {int x;std::cin >> x;a[x] = i;}}std::vector<int> ans(n), last(n, -n);for (int i = 0; i < n * m; ++ i) {if (i - last[a[i]] < n) {std::cout << -1 << "\n";return;}last[a[i]] = i;if (i < n) {ans[i] = a[i];}}for (int i = 0; i < n; ++ i) {std::cout << ans[i] + 1 << " \n"[i == n - 1];}
}

C. Game of Mathletes

有n个数,每次\(Alice\)选一个数\(a\)\(Bob\)选一个数\(b\),如果\(a+b=k\),那么分数加一,问最终分数。

分数是固定的,因为如果牌库里有\(k-a\)那么\(Bob\)一定会选。那么计算每个\(a\)\(k-a\)能产生的贡献即可。

点击查看代码
void solve() {int n, k;std::cin >> n >> k;std::vector<int> cnt(2 * n + 1);for (int i = 0; i < n; ++ i) {int x;std::cin >> x;++ cnt[x];}int ans = 0;for (int i = 1; i <= k / 2; ++ i) {if (k % 2 == 0 && i == k / 2) {ans += cnt[i] / 2;} else {ans += std::min(cnt[i], cnt[k - i]);}}std::cout << ans << "\n";
}

D. Subtract Min Sort

题意:一个数组\(a\),你每次可以让两个相邻的数一起减去他们之中的最小值。问能不能是数组非递减。

假设\([1,i]\)已经非递减,那么如果\(a_i>a_{i+1}\),那么操作\(i\)\(i+1\)是没用的,只能操作\(i-1\)\(i\),所以让\(a_i-=a_{i-1}\)。如果\(a_i<=a_{i+1}\),如果我们不操作的话,遇到\(a_{i+1}>a_{i+2}\),那么只操作\(i,i+1\)是不够的,因为这样后\(a_i=0\),而\(a_{i-1} > a_i\),所以还是得让\(a_i-=a_{i+1}\)。如果后面没有出现递减的情况,那么我们这样操作也不会影响数组。所以每次都让\(a_i-=a_{i-1}\)
注意特判\(a_1 > a_2\)的情况。

点击查看代码
void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}if (a[0] > a[1]) {std::cout << "NO\n";return;}for (int i = 1; i + 1 < n; ++ i) {a[i] -= a[i - 1];if (a[i] > a[i + 1]) {std::cout << "NO\n";return;}}std::cout << "YES\n";
}

E. Graph Composition

题意:给你两个图\(f,g\),你可以每次操作给\(f\)加一条边或者减一条边。问让两个图任意两个点联通性相同需要的最小操作数。

我们给两个图都开一个并查集记录集合。我们用\(f_u, g_u\)表示点\(u\)在两个点所在的集合。
首先如果\((u, v) \in f\),并且\(g_u \neq g_v\),那么这条边一定要删。
然后枚举\(g\)的每个集合,如果有一个\(v \in g_u\)并且\(v \notin f_u\),那么要加一条边,同时在\(f\)的集合里合并\(f_u\)\(f_v\)

点击查看代码
void solve() {int n, m, k;std::cin >> n >> m >> k;std::set<std::pair<int, int> > s1, s2;std::vector<int> fa1(n + 1), fa2(n + 1);std::iota(fa1.begin(), fa1.end(), 0);std::iota(fa2.begin(), fa2.end(), 0);std::function<int(int)> find1 = [&](int x) -> int {return x == fa1[x] ? x : fa1[x] = find1(fa1[x]);};std::function<int(int)> find2 = [&](int x) -> int {return x == fa2[x] ? x : fa2[x] = find2(fa2[x]);};for (int i = 0; i < m; ++ i) {int u, v;std::cin >> u >> v;s1.insert({u, v});}for (int i = 0; i < k; ++ i) {int u, v;std::cin >> u >> v;fa2[find2(u)] = find2(v);s2.insert({u, v});}int ans = 0;for (auto & [x, y] : s1) {if (find2(x) != find2(y)) {++ ans;} else {fa1[find1(x)] = find1(y);}}std::map<int, std::vector<int> > mp;for (int i = 1; i <= n; ++ i) {mp[find2(i)].push_back(i);}for (int i = 1; i <= n; ++ i) {for (auto & x : mp[i]) {if (find1(x) != find1(i)) {++ ans;fa1[find1(x)] = find1(i);}}}std::cout << ans << "\n";
}

F. Multiplicative Arrays
神秘dp,不会
待补

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

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

相关文章

【CodeForces训练记录】Codeforces Round 998 (Div. 3)

训练情况赛后反思 div3 给罚时拉满了,C题 \(k-a_i=a_i\) 的情况错掉怒罚五发,D题成结论猜猜乐了,E题看错题了,以为是边一致,实则联通就行,又被并查集背刺了 A题 斐波那契第三位可以从第一二位算出来,也可以从第四五位算出来,两个答案取大值即可 #include <bits/stdc…

【clang-format】C++代码风格自用配置文件,大括号换行风格

使用方法: 新建一个文本文件,把下面代码复制进去,再把名字改成.clang-format,然后粘贴到项目文件夹的根目录下即可,效果如下图。当然,IDE需要设置启用clang-format。clang-format文件内容 # LLVM Google BasedOnStyle: Google Language: Cpp# 强制花括号遵循 Allman 风格…

【clang-format】vscodeC++调整代码格式时让public顶格

习惯了leetcode里面public顶格写,vscode格式化代码public不顶格看着难受。 如图:只要在.clang-format文件中添加下面这行就行 # 访问修饰符偏移 AccessModifierOffset: -4 # -4就是public顶格如果是用vscode插件配置的: "C_Cpp.clang_format_style": "{Base…

基于反射实现的零GC高效率Unity组件绑定

前言 我是狗猥,上一世,我使用传统方式绑定UI上的组件,却因xLua扩展代码太多撑爆丹田沦为废人,失去了争夺主程岗位的资格,最后在测试同学的讥笑声中饮恨西北。 再次睁开眼,我穿越回到了拼UI的那一天。重生归来,这一世我要设计一个船新的绑定方式,夺回本就属于我的一切!…

XML+propties

txt文件,properties(属性)文件,XMl文件txt与properties与XML的区别当这些文件存储单个关系数据时, 普通文件 无法存储 关系数据,而properties属性文件以键值对形式存储就很方便,XML文件也可以 见图1 但储存多个用户就不行了,XML更适合, 见图2properties集合properties …

一条SQL更新语句是如何执行的?

与查询流程不同的是,更新流程中会涉及两个重要的模块: (i)redo_log模块(InnoDB中的日志模块):在 MySQL 里也有这么个问题,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程 IO 成本、查找成本都很高。为了解决这个问题,MyS…

大模型分布式训练并行技术(五)-序列并行

p { font-size: 12pt; line-height: 2 !important } 参考资料 大模型分布式训练并行技术(五)-序列并行 详解MegatronLM序列模型并行训练(Sequence Parallel)一、序列并行(Colossal-AI)背景 Colossal-AI 序列并行诞生的背景是 self-attention 的内存需求是输入长度(sequenc…

1.匿名内部类

使用场景不用多创建类,来使用其方法定义 匿名内部类的语法比较奇特,匿名内部类既是一个类的定义,同时他本身也是一个对象, 所以子类继承抽象类, 实现类实现接口,需要节省内存不创建类,从而创建匿名内部类 例子使用当你的才华配不上你的野心,努力的时候到了!

Arrays 排序

正常来说 Arrays可以用于数组排序, 但如果数组里面是引用类型地址就会报错,这时候, 就需要加个功能(实现接口/继承接口) Comparable接口来定引用类型对象的排序规则(以..属性值进行排序)正常Arrays.sort( 数组对象)进行排序时 , 会在排序的时候将数组对象进行调用comparato方…

Spring Boot 自动配置原理详解

引言 Spring Boot 的一大亮点是它能够自动配置(Auto-Configuration)Spring应用程序,极大地简化了Spring应用的创建过程。开发者只需添加所需的依赖,Spring Boot就会根据这些依赖和一些预设条件自动装配相应的组件,从而减少了大量样板代码的编写。 第三方组件的集成方式 对…

传奇

毋庸置疑,很多人的心里,都有一个传奇、传奇3,80后、90后,甚至70后尤甚。当然也包括我。主要当然因我曾经是盛大游戏传奇工作室研发团队的一员,且是盛大传奇3项目部的第一个程序技术人员,内心对传奇、传奇3的感情非同一般。因工作等原因,我早已不再从事传奇类游戏的开发研…

常用工具

类似gdb的bash调试工具bashdb: https://sourceforge.net/projects/bashdb/files/bashdb/ 非常好用,结合vscode bashdb(bash debug) shift + command + d,配置 .vscode/launch.json