VP Educational Codeforces Round 34 (Rated for Div. 2)

news/2025/3/15 16:47:10/文章来源:https://www.cnblogs.com/maburb/p/18773883

A. Hungry Student Problem

枚举

点击查看代码
void solve() {int n;std::cin >> n;for (int i = 0; i <= n / 3; ++ i) {if ((n - 3 * i) % 7 == 0) {std::cout << "YES\n";return;}}std::cout << "NO\n";
}

B. The Modcrab

模拟

点击查看代码
void solve() {int h1, a1, c1, h2, a2;std::cin >> h1 >> a1 >> c1 >> h2 >> a2;std::vector<std::string> ans;while(h2 > 0) {if (h1 > a2 || h2 - a1 <= 0) {ans.push_back("STRIKE");h2 -= a1;} else {ans.push_back("HEAL");h1 += c1;}h1 -= a2;}std::cout << ans.size() << "\n";for (auto & s : ans) {std::cout << s << "\n";}
}

C. Boxes Packing

题意:给你\(n\)个数,每个数可以被比自己大的一个数消除,每个数只能消除一次。问最少留下几个数。

最优的方法应该是从小到大一个一个消除,那么发现会有多余的数无法消除,显然最大的数都无法消除,其它无法消除的数是因为比它大的数比它少。那么会剩下出现次数最多的数的个数的数。

点击查看代码
void solve() {int n;std::cin >> n;std::map<int, int> cnt;for (int i = 0; i < n; ++ i) {int x;std::cin >> x;++ cnt[x];}int ans = 0;for (auto & [x, y] : cnt) {ans = std::max(ans, y);}std::cout << ans << "\n";
}

D. Almost Difference

题意:给你\(n\)个数,对于两个数\(a_i, a_j\),如果它们相差大于\(1\),那么值为\(a_j - a_i\)。求所有\(i < j\)\(i, j\)的值。

从前往后做,那么就变成了找\([1, a_j - 2]\)的数的出现次数以及总和,还有\([a_j + 2, V]\)的数的出现次数以及总和。其中\(V\)是最大的数的值。那么我们离散化后用两个树状数组分别维护这两个值就行了。记住对于\(a_i\),要把\(a_i - 1, a_i + 1\)也加入离散化,不然可能离散化后跟\(a_i\)相邻的数相差会大于\(1\)
还有一个就是这题要用\(int128\)

点击查看代码
template <class T>
struct Fenwick {int n;std::vector<T> tr;Fenwick(int _n) {init(_n);}void init(int _n) {n = _n;tr.assign(_n + 1, T{});}void add(int x, const T &v) {for (int i = x; i <= n; i += i & -i) {tr[i] = tr[i] + v;}}T query(int x) {T res{};for (int i = x; i; i -= i & -i) {res = res + tr[i];}return res;}T sum(int l, int r) {return query(r) - query(l - 1);}
};std::ostream & operator << (std::ostream & out, i128 n) {bool flag = false;if (n < 0) {flag = true;n = -n;}std::vector<int> res;do {res.push_back(n % 10);n /= 10;} while (n != 0);std::reverse(res.begin(), res.end());if (flag) {out << "-";}for (auto & x : res) {out << x;}return out;
}void solve() {int n;std::cin >> n;std::vector<i64> a(n), b;for (int i = 0; i < n; ++ i) {std::cin >> a[i];b.push_back(a[i]);b.push_back(a[i] + 1);b.push_back(a[i] - 1);}b.push_back(0);b.push_back(-1);b.push_back(-2);std::sort(b.begin(), b.end());b.erase(std::unique(b.begin(), b.end()), b.end());int m = b.size();auto get = [&](i64 x) -> int {return std::lower_bound(b.begin(), b.end(), x) - b.begin();};Fenwick<i128> tr(m + 2), cnt(m + 2);i128 ans = 0;for (auto & x : a) {int y = get(x);ans += cnt.sum(1, y - 2) * x - tr.sum(1, y - 2) ;ans += cnt.sum(y + 2, m + 2) * x - tr.sum(y + 2, m + 2);tr.add(y, x);cnt.add(y, 1);}std::cout << ans << "\n";
}

E. Swapping Characters

题意:给定\(n\)个长度相同的字符串。求有没有一个字符串,使得所有字符串都是被这个字符串交换其中字符恰好一次变化过来的。

如果有答案,那么\(s_1\)一定是交换一次变过来的,考虑逆操作,我们枚举交换\(s_1\)的两个位置,然后检查其它字符串能不能通过它恰好一次变化过来。这样每次检查的时间复杂度不能接受。可以预处理每个字符串和\(s1\)不同地方的个数,那么每次交换两个位置,只需要讨论这个位置的贡献就行了。判断能不能变化过来就是,不同的位置只能是\(0\)个或者\(2\)个,如果是\(0\)个,因为必须交换两个不同的位置,那么这个字符串必须要由两个相同的字符。如果是\(2\)个,那么找到这两个位置,判断交换后是不是相等就行了。

点击查看代码
void solve() {int n, m;std::cin >> n >> m;std::vector<std::string> s(n);for (int i = 0; i < n; ++ i) {std::cin >> s[i];}std::vector<int> f(n);for (int i = 0; i < n; ++ i) {for (int j = 0; j < m; ++ j) {for (int k = j + 1; k < m; ++ k) {f[i] |= s[i][j] == s[i][k];}}}std::vector st(n, std::vector<int>(m));std::vector<int> cnt(n);for (int i = 1; i < n; ++ i) {for (int j = 0; j < m; ++ j) {st[i][j] += s[0][j] != s[i][j];cnt[i] += s[0][j] != s[i][j];}}for (int i = 0; i < m; ++ i) {for (int j = i + 1; j < m; ++ j) {for (int k = 1; k < n; ++ k) {st[k][i] -= s[0][i] != s[k][i];st[k][j] -= s[0][j] != s[k][j];cnt[k] -= s[0][i] != s[k][i];cnt[k] -= s[0][j] != s[k][j];}std::swap(s[0][i], s[0][j]);for (int k = 1; k < n; ++ k) {st[k][i] += s[0][i] != s[k][i];st[k][j] += s[0][j] != s[k][j];cnt[k] += s[0][i] != s[k][i];cnt[k] += s[0][j] != s[k][j];}bool flag = true;for (int k = 1; k < n; ++ k) {if (cnt[k] != 0 && cnt[k] != 2) {flag = false;break;}if (cnt[k] == 2) {int p1 = 0, p2 = m - 1;while (st[k][p1] == 0) {++ p1;}while (st[k][p2] == 0) {-- p2;}if (s[k][p1] != s[0][p2] || s[k][p2] != s[0][p1]) {flag = false;break;}} else if (cnt[k] == 0 && !f[k]) {flag = false;break;}}if (flag) {std::cout << s[0] << "\n";return;}for (int k = 1; k < n; ++ k) {st[k][i] -= s[0][i] != s[k][i];st[k][j] -= s[0][j] != s[k][j];cnt[k] -= s[0][i] != s[k][i];cnt[k] -= s[0][j] != s[k][j];}std::swap(s[0][i], s[0][j]);for (int k = 1; k < n; ++ k) {st[k][i] += s[0][i] != s[k][i];st[k][j] += s[0][j] != s[k][j];cnt[k] += s[0][i] != s[k][i];cnt[k] += s[0][j] != s[k][j];}			}}std::cout << -1 << "\n";
}

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

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

相关文章

web68笔记(+禁用print_r、highlight)

web68 打开就直接说 Warning: highlight_file() has been disabled for security reasons in /var/www/html/index.php on line 19 猜跟之前代码一致,加了过滤 然后这⾥还把print_r给禁了,⽤var_dump()吧 c=var_dump(scandir("/")); 还是在跟⽬录 flag.txt 既然hig…

健身相关

后仰?10次 如何管理自己的症状 急性期https://new.qq.com/rain/a/20210819A094EC00犀牛数据地点+纳税排名

文本弹窗选择

@Entry@Componentstruct TextPickerDialogPage { fruits: string[] = [苹果, 橘子, 香蕉, 鸭梨, 西瓜] @State selectedIndex: number = 0 build() { Column({ space: 50 }) { Text(this.fruits[this.selectedIndex]) .fontWeight(FontWeight.Bold) .…

AP csa FRQ Q1 Past Paper 五年真题汇总 2023-2019

Author(wechat): bigshuang2020 ap csa tutor, AP计算机科学a老师 国际教育编程老师, 擅长答疑讲解,带学生实践学习。热爱创作,作品:ap csa原创教案,真题梳理汇总,FRQ专题冲刺。2023 FRQ Question 1 This question involves the appointmentBook class, which provides me…

自带弹窗-》删除功能提示

@Entry@Componentstruct AlertDialogPage { build() { Column() { Button(删除) .backgroundColor(Color.Red) .onClick(() => { AlertDialog.show( { title: 删除该记录?, //弹窗标题 message: 删除…

ASE90N25-ASEMI工业电机专用ASE90N25

ASE90N25-ASEMI工业电机专用ASE90N25编辑:ll ASE90N25-ASEMI工业电机专用ASE90N25 型号:ASE90N25 品牌:ASEMI 封装:TO-247 批号:最新 最大漏源电流:90A 漏源击穿电压:250V RDS(ON)Max:26mΩ 引脚数量:3 沟道类型:N沟道MOS管、中低压MOS管 漏电流:ua 特性:N沟道MO…

温度转化和蟒蛇绘制

蟒蛇绘制 import turtle turtle.setup(650,360,600,200) turtle.penup() turtle.fd(-250) turtle.pendown() turtle.pensize(25) turtle.pencolor("pink") turtle.seth(-40) for i in range(4): turtle.circle(40,80) turtle.circle(-40,80) turtle.circle(40,80/2) …

Java面向对象编程(OOP)

面向过程&面向对象 面向过程思想:步骤清晰简单,第一步该做什么,第二步该做什么... 适合处理一些较为简单的问题 线性思维面向对象四思想:物以类聚,分类的思维模式,思考问题首要解决问题需要哪些分类,然后对这些分类进行单独思考,最后才对某个分类下的细节进行面向过…

第二章作业

由于一至三题只存了源代码,自己写的没有保存,所以仅以截图展示。四至八题则采取代码和截图一起的方式展示。 2.4 import turtle turtle.setup(650,360,800,200) turtle.penup() turtle.fd(-250) turtle.pendown() turtle.pensize(25) turtle.seth(-40) colors = ["blue&…

book_第2章例题

1.温度转化(符号在后) 2.温度转化(符号在前) 3.蟒蛇例题

SvelteKit 最新中文文档教程(3)—— 数据加载

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

web57笔记(严格过滤-$和()来构造数字)

<?php/* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-05 20:49:30 # @Last Modified by: h1xa # @Last Modified time: 2020-09-08 01:02:56 # @email: h1xa@ctfer.com # @link: https://ctfer.com */// 还能炫的动吗? //flag in 36.php if(isset($_GE…