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

news/2025/3/19 15:37:35/文章来源:https://www.cnblogs.com/maburb/p/18781140

A. Water The Garden

题意:长度为\(n\)的直线上有\(k\)个点,第\(i\)个点的坐标为\(x_i\)。第\(t\)时刻第\(i\)个点会覆盖\([i - t + 1, i + t - 1]\)。求覆盖所有点最小时间。

可以二分加差分做。数据范围很小,也可以枚举\(t\)然后差分。

点击查看代码
void solve() {int n, k;std::cin >> n >> k;std::vector<int> a(k);for (int i = 0; i < k; ++ i) {std::cin >> a[i];}auto check = [&](int t) -> bool {std::vector<int> d(n + 2);for (auto & x : a) {int l = std::max(1, x - t + 1), r = std::min(n, x + t - 1);++ d[l];-- d[r + 1];}for (int i = 1; i <= n; ++ i) {d[i] += d[i - 1];if (d[i] == 0) {return false;}}return true;};int l = 1, r = n;while (l < r) {int mid = l + r >> 1;if (check(mid)) {r = mid;} else {l = mid + 1;}}std::cout << l << "\n";
}

B. Tea Queue

题意:第\(i\)个人在\([l_i, r_i]\)时刻喝茶,每一时刻只有一个人可以喝茶,如果同一时刻有多个人可以喝茶则编号小的先喝。求每个人喝到茶的最小时间,如果喝不到答案是0。

模拟过去,记录一个\(t\)表示上一个人喝完茶后的时间。那么如果\(t \leq r_i, t = \max(t, l_i) + 1\)

点击查看代码
void solve() {int n;std::cin >> n;std::vector<int> ans(n);for (int i = 0, t = 1; i < n; ++ i) {int l, r;std::cin >> l >> r;if (l >= t) {t = l + 1;ans[i] = l;} else if (r >= t) {ans[i] = t;++ t;} else {ans[i] = 0;}}for (int i = 0; i < n; ++ i) {std::cout << ans[i] << " \n"[i == n - 1];}
}

C. Swap Adjacent Elements

题意:给出一个排列,和一个字符串,如果\(s_i\)是1那么可以交换\(p_i, p_{i+1}\)。求能不能使数字升序。

可以发现以连续的1为一段,那么每一段是不相交的。那么把这些段进行排序,看是不是升序就行了。

点击查看代码
void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}std::string s;std::cin >> s;for (int i = 0; i < n; ++ i) {if (s[i] == '1') {int j = i + 1;while (j < n && s[j] == '1') {++ j;}j = std::min(n - 1, j);std::sort(a.begin() + i, a.begin() + j + 1);i = j;}}for (int i = 0; i + 1 < n; ++ i) {if (a[i] > a[i + 1]) {std::cout << "NO\n";return;}}std::cout << "YES\n";
}

D. Tanks

待补。


E. Connected Components?

题意:给你一个图,求这个图的补图的联通块数量以及每个联通块的点个数。

如果暴力做,我们可以枚举每个点,把和它没有边的点合并到一个集合。但这样会超时。
考虑寻找图里度数最小的点,这个点的度数最大为\(\frac{m}{n}\)。然后拿它做一次。那么只剩下\(\frac{m}{n}\)没有被合并,拿出来都操作一次,总共是\(\frac{m}{n} \times n = m\)的时间复杂度。

点击查看代码
struct DSU {std::vector<int> fa, cnt;DSU(int _n) {init(_n);}void init(int _n) {fa.assign(_n, 0);cnt.assign(_n, 1);std::iota(fa.begin(), fa.end(), 0);}int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}bool merge(int x, int y) {x = find(x), y = find(y);if (x == y) {return false;}fa[y] = x;cnt[x] += cnt[y];return true;}bool same(int x, int y) {return find(x) == find(y);}int size(int x) {return cnt[find(x)];}
};void solve() {int n, m;std::cin >> n >> m;std::vector<int> in(n);std::vector<std::vector<int>> adj(n);for (int i = 0; i < m; ++ i) {int u, v;std::cin >> u >> v;-- u, -- v;adj[u].push_back(v);adj[v].push_back(u);++ in[u], ++ in[v];}int u = 0;for (int i = 1; i < n; ++ i) {if (in[i] < in[u]) {u = i;}}std::vector<int> vis(n);for (auto & v : adj[u]) {vis[v] = 1;}DSU dsu(n);for (int i = 0; i < n; ++ i) {if (!vis[i]) {dsu.merge(u, i);}}for (int i = 0; i < n; ++ i) {if (!vis[i]) {continue;}std::vector<int> vis1(n);for (auto & v : adj[i]) {vis1[v] = 1;}for (int j = 0; j < n; ++ j) {if (!vis1[j]) {dsu.merge(i, j);}}}std::vector<int> ans;for (int i = 0; i < n; ++ i) {if (dsu.find(i) == i) {ans.push_back(dsu.size(i));}}std::sort(ans.begin(), ans.end());std::cout << ans.size() << "\n";for (auto & x : ans) {std::cout << x << " ";}std::cout << "\n";
}

F. SUM and REPLACE

题意:定义\(d(i)\)\(i\)的因子个数。给你一个数字,每次操作一个区间,询问区间和或者把区间每个\(a_i\)变为\(d(a_i)\)

打表发现,一个数最多变\(6\)次就变成了1或者2。那么我们可以势能线段树。简单来说就是线段树区间操作改为每个点暴力操作,发现某个区间的数都操作超过6次就不操作。

点击查看代码
#define ls (u << 1)
#define rs (u << 1 | 1)
#define umid (tr[u].l + tr[u].r >> 1)template <class Info, class Tag>
struct Node {int l, r;Info info;Tag tag;
};template <class Info, class Tag>
struct LazySegmentTree {std::vector<Node<Info, Tag> > tr;LazySegmentTree(int _n) {init(_n);}LazySegmentTree(std::vector<Info> & a) {int _n = (int)a.size();init(_n, a);}void init(int _n) {tr.assign(_n << 2, {});build(0, _n - 1);}void init(int _n, std::vector<Info> & a) {tr.assign(_n << 2, {});build(0, _n - 1, a);}void pushup(int u) {tr[u].info = tr[ls].info + tr[rs].info;}void pushdown(Node<Info, Tag> & u, Tag tag) {u.info = u.info + tag;u.tag = u.tag + tag;}void pushdown(int u) {if (tr[u].tag.exist()) {pushdown(tr[ls], tr[u].tag);pushdown(tr[rs], tr[u].tag);tr[u].tag.clear();}}void build(int l, int r, int u = 1) {tr[u] = {l, r, {}};if (l == r) {return;}int mid = l + r >> 1;build(l, mid, ls); build(mid + 1, r, rs);pushup(u);}void build(int l, int r, std::vector<Info> & a, int u = 1) {tr[u] = {l, r, {}};if (l == r) {tr[u].info = a[l];return;}int mid = l + r >> 1;build(l, mid, a, ls); build(mid + 1, r, a, rs);pushup(u);}void modify(int l, int r, Tag tag, int u = 1) {if (tr[u].info.cnt >= 6) {return;}if (tr[u].l == tr[u].r) {pushdown(tr[u], tag);return;}// pushdown(u);int mid = umid;if (l <= mid) {modify(l, r, tag, ls);}if (r > mid) {modify(l, r, tag, rs);}pushup(u);}Info query(int l, int r, int u = 1) {if (l <= tr[u].l && tr[u].r <= r) {return tr[u].info;}// pushdown(u);int mid = umid;if (r <= mid) {return query(l, r, ls);}  else if (l > mid) {return query(l, r, rs);}return query(l, r, ls) + query(l, r, rs);}// int query_first_not_appear(int u = 1) {// 	if (tr[u].l == tr[u].r) {// 		return tr[u].l;// 	}// 	pushdown(u);// 	int mid = umid;// 	if (tr[ls].info.sum != tr[ls].info.len) {// 		return query_first_not_appear(ls);// 	} else {// 		return query_first_not_appear(rs);// 	}// }
};struct Info {i64 sum;int cnt;
};struct Tag {int cnt;bool exist() {	return cnt != 0;}void clear() {cnt = 0;}
};const int N = 1e6 + 5;
int f[N];Info operator + (const Info & a, const Info & b) {Info res{};res.sum = a.sum + b.sum;res.cnt = std::min(a.cnt, b.cnt);return res;
}Info operator + (const Info & a, const Tag & b) {Info res{};res.sum = f[a.sum];res.cnt = a.cnt + 1;return res;
}Tag operator + (const Tag & a, const Tag & b) {Tag res{};res.cnt = a.cnt + b.cnt;return res;
}void solve() {for (int i = 1; i < N; ++ i) {for (int j = i; j < N; j += i) {f[j] += 1;}}    int n, m;std::cin >> n >> m;std::vector<int> a(n);std::vector<Info> info(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];info[i] = {a[i], 0};}LazySegmentTree<Info, Tag> tr(info);while (m -- ) {int op, l, r;std::cin >> op >> l >> r;-- l, -- r;if (op == 1) {tr.modify(l, r, Tag{1});} else {std::cout << tr.query(l, r).sum << "\n";}}
}

G. List Of Integers

题意:求大于\(x\)的第\(k\)个与\(p\)互质的数。

考虑二分这个数,那么变成了求\([1, mid]\)里与\(p\)互质的数的个数。我们可以对\(p\)质因子分解,然后枚举每个选不选,容斥即可。

点击查看代码
void solve() {i64 x, p, k;std::cin >> x >> p >> k;std::vector<i64> a;for (int i = 2; i <= p / i; ++ i) {if (p % i == 0) {a.push_back(i);while (p % i == 0) {p /= i;}}}    if (p > 1) {a.push_back(p);}auto dfs = [&](auto & self, int u, int cnt, i64 sum, i64 n) -> i64 {if (u == a.size()) {return n / sum * (cnt % 2 ? -1 : 1);}return self(self, u + 1, cnt, sum, n) + self(self, u + 1, cnt + 1, sum * a[u], n);};i64 l = x + 1, r = 1e18, v = dfs(dfs, 0, 0, 1, x);while (l < r) {i64 mid = l + r >> 1ll;if (dfs(dfs, 0, 0, 1, mid) - v >= k) {r = mid;} else {l = mid + 1;}}std::cout << l << "\n";
}

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

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

相关文章

小程序 反编译

背景 小程序测试难点,数据包加密?有签名存在?导致测试受阻 工具 wedecode wedecode https://github.com/biggerstar/wedecode1.首次使用,源码安装方式 git clone https://github.com/biggerstar/wedecode npm install # 如果 npm 安装很慢, 可以使用右侧命令换国内的淘宝…

日志文件必须输出到控制台才香对吗

在实际工作中发现很多人喜欢将日志输出到控制台,有的甚至直接只是输出到控制台,都不输出到日志文件中。 这种操作看似人畜无害,实际上直接影响着系统的性能,很多时候还难以排查,这里我从实际举例都背后原因来分析为什么这么做并不香。通常的日志配置 这里我们使用经常使用…

C#通过FTP获取服务端文件

一、简介实际需求是在前端修改了配置文件后,由上位机统一分发给所有设备,因为下位机支持FTP协议,因此选用FTP来实现文件传输功能。 二、准备工作 1、FTP服务搭建FTP服务端选用FileZilla Server,免费开源,简单好用,可以下载中文版的。下载地址:下载 - FileZilla中文网,也…

20242942 2024-2025-2 《网络攻防实践》实验三

1.实验内容 (1)动手实践tcpdump 使用tcpdump开源软件对在本机上访问www.tianya.cn网站过程进行嗅探,回答问题:你在访问www.tianya.cn网站首页时,浏览器将访问多少个Web服务器?他们的IP地址都是什么? (2)动手实践Wireshark 使用Wireshark开源软件对在本机上以TELNET方式…

Oracle OCP认证没落了吗?

Oracle OCP认证没落了吗? Oracle的OCP认证是数据库领域必考的一个认证,但随着国产化的发展,国内很多企业开发了自己的数据库产品,这种情况对很多人造成了错误的认识:OCP被淘汰了吗?不然,从行业需求、技术趋势、认证体系变化等角度综合分析,Oracle OCP证书并未完全“没…

查看dll文件的publicKeyToken

输入: SN -T "C:\Program Files (x86)\Kingdee\K3Cloud\WebSite\bin\log4net.dll"

把 DeepSeek 接入电话系统后,不知疲倦的智能客服向我们走来了

我们基于deepseek和Freeswitch做了一个智能电话客服。 它会基于给定的FAQ知识库来回答问题,自动进行语音识别和语音合成。 语音识别我们采用的是开源的FunAsr,语音合成采用的是第三方商用的API接口。我们接下来介绍下它的内部组成部分。【 第一阶段】当电话拨通电话后,电话服…

Seata的工作模式

Seata的分布式模型中各个角色的作用: 1.TM(事务管理器)是分布式事务的发起方,负责定义全局事务的边界(开始,提交,回滚),并于TC交互协调事务状态。 核心职责: ​ 通过@GlobalTransctional注解标记全局事务的起点。 ​ 向TC注册全局事务 ​ 根据业务逻辑决定全局事务的提交或回滚…

dify升级

一、需求 从0.14.2升级到0.15.3,要求模型供应商,创建的应用数据等等,不能丢失。二、安装0.14.2 下载dify代码cd /optgit clone https://github.com/langgenius/dify.gitcd dify/切换到tag 0.14.2git checkout 0.14.2git pull origin 0.14.2运行difycd dockercp .env.example…

机器人弧焊电源气体省气装置的工作原理是什么?

焊接机器人节气装置,作为一种在焊接流程中至关重要的气体调控设备,其核心宗旨在于在确保焊接作业品质卓越的同时,通过高度精确的气体流量调控机制,有效缩减气体的消耗量,进而达成显著的节气效益。该装置详尽地集成了气体质量流量控制器、适配的电源适配器、精准的电流传感…

分享一次利用无问AI进行应急响应

前情摘要:最近勒索病毒真的太猖獗了,光一星期我就接连处理了两起。不过黑客的攻击方式都是大同小异,处理完报告之后,特来分享其中一起。各位可得小心小心在小心,千万不要中招,不然就只有重装的份了。 事件概述: 最近,某公司机房数据库中了勒索病毒,工作人员上班发现后…

广告子包边切割焊接工艺-代加工-外协加工-委外加工-激光代加工-河南郑州-芯晨微纳(河南)

一、普通焊接 普通焊接主要针对大型标识,如银行或家具城的大型广告字。这种焊接方式使用焊机进行,具体流程包括: (1)切割:根据所需的字体大小,使用不同的激光切割机进行切割处理。这一步不仅包括字面的切割,还包括围边的切割。 (2)焊接包边:在焊接过程中,需要非常精…