当前位置: 首页 > news >正文

Codeforces Global Round 30 (Div. 1 + Div. 2)


A. Sequence Game

题意:一个数组\(a\),每次选择两个相邻的数,用它们之间的一个值替换它们两个。求最后能不能使得留下的数是\(x\)

如果\(\min(a) \leq x \leq \max(a)\)则可行。
最小值和最大值和别人操作时可以留下自己,然后让这两个值最后一起操作。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}int x;std::cin >> x;if (x <= std::ranges::max(a) && x >= std::ranges::min(a)) {std::cout << "YES\n";} else {std::cout << "NO\n";}
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;std::cin >> t;while (t -- ) {solve();}return 0;
}

B. Even Modulo Pair

题意:给你一个严格递增的序列,求有没有两个数\(x, y\)满足\(y \mod x\)是偶数。其中\(y > x\)

如果至少有两个偶数,那么偶数模偶数是偶数。
否则考虑一堆奇数的情况,如果\(a_i\)\(a_{i-1}\)是奇数,设\(a_i = qa_{i-1} + r\),其中\(r\)是奇数,那么\(q\)是偶数,否则奇数乘奇数加奇数会是一个偶数。也就是说\(a_i > 2a_{i-1}\)
那么当\(n\)很大时,必然有解,且直接双层循环暴力很快就能找到解。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}int even = -1;int last = -1;for (int i = 0; i < n; ++ i) {if (a[i] % 2 == 0) {if (even != -1) {std::cout << even << " " << a[i] << "\n";return;} else {even = a[i];for (int j = 0; j < i; ++ j) {if (a[i] % a[j] % 2 == 0) {std::cout << a[j] << " " << a[i] << "\n";return;}}}} else {for (int j = i + 1; j < n; ++ j) {if (a[j] % a[i] % 2 == 0) {std::cout << a[i] << " " << a[j] << "\n";return;}}}}std::cout << -1 << "\n";
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;std::cin >> t;while (t -- ) {solve();}return 0;
}

C. Dungeon

题意:有\(n\)把剑,每把攻击力为\(a_i\)。有\(m\)个怪物,两个属性\(b_i, c_i\)。如果你用\(i\)这把剑攻击\(j\)这个怪物,需要满足\(a_i \geq b_j\)才可以。且当\(c_j > 0\)时,\(a_i\)会变成\(\max(a_i, c_j)\),否则第\(i\)把剑不能再用。每个怪物也只能杀一次。求最多杀几个。

考虑把\(c_i = 0\)的怪物留到最后杀。
我们希望尽可能提高剑的攻击力,那么可以把剑从小到大排序,怪物按\(b_i\)也从小到大排序,每次选一个大于等于\(b_i\)最小的剑出来,其它更小的剑可以留着杀\(c_i = 0\)的怪物。那么每次最小的剑可能变大,相当于用一个大剑换了一个小剑。最后把所有剑从小到大贪心攻击\(c_i = 0\)的怪物就行。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n, m;std::cin >> n >> m;std::vector<int> a(n), b(m), c(m);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}for (int i = 0; i < m; ++ i) {std::cin >> b[i];}std::vector<std::pair<int, int>> d(m);for (int i = 0; i < m; ++ i) {std::cin >> c[i];d[i] = {b[i], c[i]};}std::ranges::sort(d);std::multiset<int> s(a.begin(), a.end());int ans = 0;std::vector<int> e;std::multiset<int> s1;for (auto & [x, y] : d) {while (s.size() && *s.begin() < x) {s1.insert(*s.begin());s.erase(s.begin());}if (s.size()) {auto it = s.begin();int v = *it;if (y != 0) {++ ans;s.erase(it);v = std::max(v, y);s.insert(v);} else {e.push_back(x);}} else {break;}}s.insert(s1.begin(), s1.end());for (auto & x : e) {while (s.size() && *s.begin() < x) {s.erase(s.begin());}if (s.size()) {++ ans;s.erase(s.begin());} else {break;}}std::cout << ans << "\n";
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;std::cin >> t;while (t -- ) {solve();}return 0;
}

D. Copy String

题意:两个字符串\(s, t\),你想要把\(s\)变成\(t\)。每一轮操作力,你可以让\(s'_i = s_i\)\(s_{i-1}\)。然后\(s = s'\)。求最小操作数和方案。如果最小操作数大于\(k_max\)输出\(-1\)

显然操作只能把前面的字符蔓延到后面。我们可以从后往前看,每次找\(s_j = t_i\)的最后的\(j\),这个\(j\)不能超过后面选择的位置。
具体说,我们记录一个\(last\),表示\(t_{i+1}\)选择的位置,那么我们需要移动\(i+1 - last\)步把\(s_last\)处的字符蔓延到\(t_{i+1}\)。这个过程肯定会覆盖\(t_i\)一次。所以\(t_i\)选择的位置必须小于等于\(last\)。如果没有这样的位置无解。
然后我们可以按照每个位置选择的位置,每次操作中把还没到位的往后移就行。操作数就是最远的两个位置。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n, K;std::cin >> n >> K;std::string s, t;std::cin >> s >> t;if (s[0] != t[0]) {std::cout << -1 << "\n";return;}std::array<std::vector<int>, 26> pos;std::vector<int> p(n), d(n);int k = 0;for (int i = 0; i < n; ++ i) {pos[s[i] - 'a'].push_back(i);}int last = n;for (int i = n - 1; i >= 0; -- i) {auto it = std::ranges::upper_bound(pos[t[i] - 'a'], std::min(i, last));if (it == pos[t[i] - 'a'].begin()) {std::cout << -1 << "\n";return;}-- it;p[i] = *it;d[i] = i - p[i];last = std::min(last, p[i]);k = std::max(k, d[i]);}if (k > K) {std::cout << -1 << "\n";return;}std::cout << k << "\n";for (int i = 1; i <= k; ++ i) {std::string ns = s;for (int j = 1; j < n; ++ j) {if (d[j] >= i) {ns[j] = s[j - 1];}}std::cout << ns << "\n";s = ns;}
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;std::cin >> t;while (t -- ) {solve();}return 0;
}
http://www.jsqmd.com/news/33675/

相关文章:

  • 价值权衡的完整计算模型:价值体系与规则体系的辩证统一
  • 试试用 MiniMax Agent 做一个介绍 JSON 格式化网站的页面
  • 【esp32 学习笔记】采用 millis() 函数的非阻塞循环的写法
  • USSD 代码
  • 2025年11月脸部泛红产品推荐榜:泛红舒缓精华实测排名
  • 2025年11月脸部泛红产品推荐榜:屏障修护精华对比榜单
  • 2025年11月进度管理工具评价榜:行业数据与用户反馈全解析
  • 2025年11月北京房产纠纷律师排名分析:客观评价与实务参考
  • 2025年11月黄黑皮美白产品对比榜:从成分到肤感十款实测排名
  • 2025年11月学生平板品牌推荐:护眼大屏榜对比学习场景差异
  • 2025年11月学生平板品牌评测榜:从双师1对1到全科AI精准学横向对比
  • 2025年11月智能学习机品牌推荐:AI精准学榜多维评测
  • 2025年11月智能学习机品牌对比榜:新课标同步与护眼大屏机型排名
  • 2025年11月学生平板品牌推荐:新课标榜排行六合一功能解析
  • 2025年11月智能学习机品牌推荐:市场热销榜排行全透视
  • 2025年11月智能学习机品牌推荐:护眼大屏榜与用户评价排行
  • 2025年11月学习机品牌推荐榜:AI精准学机型口碑对比评测
  • 2025年11月卖得好的学习机品牌推荐:AI学习机榜横向评测
  • 2025年11月干皮精华产品推荐榜:五款干敏肌适用精华排行
  • 2025年11月干皮精华产品精选榜:五款干敏肌适用精华对比
  • 2025年11月卖得好的学习机品牌推荐:市场销量榜与对比评价
  • 2025年11月学习机品牌推荐:清北规划师口碑评价榜
  • 2025年11月黄褐斑改善产品推荐榜:成分技术与用户反馈综合排行
  • 2025年11月学习机品牌推荐:新课标同步榜评测盘点
  • 2025年11月黄褐斑改善产品评价榜:五款临床级单品数据解析
  • 2025年11月适合小学生的学习机推荐榜:五强参数与体验全解析
  • 2025年11月婚礼前美白产品推荐榜:准新娘淡斑评价合集
  • 2025年11月又红又痒用什么产品推荐榜:五款修护精华综合排行
  • 2025年11月又红又痒用什么产品推荐榜:口碑排行与多维评价一览
  • 2025年11月又红又痒用什么产品推荐:口碑榜五强修护精华深度评测