Squarepoint Challenge (Codeforces Round 1055, Div. 1 + Div. 2) A~E

news/2025/10/5 22:22:46/文章来源:https://www.cnblogs.com/Kescholar/p/19127112

A - Increase or Smash

模拟。

对于每个不是最大值的来说,都会经历一次先置为零然后再加的操作,重复项只计算一次;而最大值不用置为零,所以最开始会有一次。

点击查看代码
#include <bits/stdc++.h>using namespace std;using i64 = long long;void solve() {int n;cin >> n;vector<int> a(n + 1);for (int i = 1; i <= n; i += 1) {cin >> a[i];}int Max = *max_element(a.begin() + 1, a.end());int cnt[101] {}, ans = 1;for (int i = 1; i <= n; i += 1) {if (a[i] != Max) {if (cnt[a[i]] == 0) {ans += 2;cnt[a[i]] += 1;}}}cout << ans << "\n";}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin >> t;while (t--) {solve();}return 0;
}

B - Catching the Krug

分类讨论。

以下以 \(A\) 代表抓的人,\(B\) 代表被抓的人。因为 \(A\) 可以斜着跑,所以只要 \(B\) 不在和 \(A\)\(x\) 轴或 \(y\) 轴上,\(A\) 都可以一边追的同时通过斜着跑移动到同一轴上,从而使得距离只到四个边界上就能抓住他,而 \(B\) 想要活久一点就只能朝相反方向跑,所以最后答案就是判断 \(B\) 朝与 \(A\) 相反的两个坐标轴跑, \(A\) 到达这两个坐标轴的最大距离。

image

点击查看代码
#include <bits/stdc++.h>using namespace std;using i64 = long long;void solve() {int n, k[2], d[2];cin >> n >> k[0] >> k[1] >> d[0] >> d[1];int ans = 0;for(int x = 0; x <= 1; x += 1) {if(k[x] < d[x]) {ans = max(ans, d[x]);} else if(k[x] > d[x]) {ans = max(ans, n - d[x]);}}cout << ans << "\n";}
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin >> t;while (t--) {solve();}return 0;
}

C - Triple Removal

前缀和/线段树。

手玩可以发现的是,如果存在两个相邻 \(0/1\),一定通过每次消耗 \(1\) 的代价可以将该区间全部消完(假设区间 \(0/1\) 个数为 \(3\) 的倍数),比如 \(1\textcolor{red}{00}1\textcolor{red}00101011\rightarrow \textcolor{red}{11}0\textcolor{red}{1}01011 \rightarrow \textcolor{red}{00}1\textcolor{red}011\rightarrow \textcolor{red}{111}\),只有 \(010101..\) 交替的时候需要多一次 \(1\) 的代价,后面就都是按照相邻的消法即可。

可以用前缀和维护存不存在相邻的 \(0/1\),我是直接上线段树了。

点击查看代码
#include <bits/stdc++.h>using namespace std;using i64 = long long;template<class Info>
struct SegmentTree {int n;vector<Info> info;SegmentTree(): n(0) {}SegmentTree(int n_, Info v_ = Info()) {init(n_, v_);}template<class T>SegmentTree(vector<T> init_) {init(init_);}void init(int n_, Info v_ = Info()) {init(vector(n_, v_));}template<class T>void init(vector<T> init_) {n = init_.size();info.assign((4 << __lg(n) + 1) + 10, Info());function<void(int, int, int)> build = [&](int u, int l, int r) {if (l == r) {info[u] = init_[l - 1];return ;}i64 m = (l + r) / 2;build(2 * u, l, m);build(2 * u + 1, m + 1, r);pushup(u);};build(1, 1, n);}void pushup(int u) {info[u] = info[2 * u] + info[2 * u + 1];}void modify(int u, int l, int r, int x, const Info &v) {if (l == r) {info[u] = v;return;}int m = (l + r) / 2;if (x <= m) {modify(2 * u, l, m, x, v);} else {modify(2 * u + 1, m + 1, r, x, v);}pushup(u);}void modify(int u, const Info &v) {modify(1, 1, n, u, v);}Info rangeQuery(int u, int l, int r, int x, int y) {if (l > y || r < x) {return Info();}if (l >= x && r <= y) {return info[u];}int m = (l + r) / 2;return rangeQuery(2 * u, l, m, x, y) + rangeQuery(2 * u + 1, m + 1, r, x, y);}Info rangeQuery(int l, int r) {return rangeQuery(1, 1, n, l, r);}
};struct Info {int cnt[2] {};int val[2] {};bool adj = false;
};Info operator+(const Info &l, const Info &r) {Info res;if(r.cnt[0] + r.cnt[1] == 0) {return l;}if(l.cnt[0] + l.cnt[1] == 0) {return r;}res.cnt[0] = l.cnt[0] + r.cnt[0];res.cnt[1] = l.cnt[1] + r.cnt[1];res.val[0] = l.val[0];res.val[1] = r.val[1];res.adj |= (l.val[1] == r.val[0] || l.adj || r.adj);return res;
}void solve() {int n, q;cin >> n >> q;SegmentTree<Info> seg(n);for(int i = 1; i <= n; i += 1) {int x;cin >> x;seg.modify(i, {1 - x, x, x, x});}while(q --) {int l, r;cin >> l >> r;auto res = seg.rangeQuery(l, r);if(res.cnt[0] % 3 || res.cnt[1] % 3) {cout << "-1\n";continue;}int ans = (r - l + 1) / 3;ans += res.adj != true;cout << ans << "\n";}}
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin >> t;while (t--) {solve();}return 0;
}

D. Division Versus Addition

思维,前缀和/线段树。

以下定义三类数,如果 \(a_i=2^k\),定义为 \(A\) 类型;\(a_i=2^k+1\),为 \(B\) 类型;其余为 \(C\) 类型,定义 \(|X|\) 代表 \(X\) 类型的数量。

\(A\) 类型比较好分析,\(+1\) 并不会增加代价,所以对面对 \(A\) 类型下手,跟着操作即可;\(B\) 类型,对面一旦下手,操作必定会增加一次,所以当对面对 \(B\) 类型下手,我也得去对其他 \(B\) 类型下手,尽可能减少对面能下手的数量,由于我是先手,一定尽可能对 \(B\) 先下手;\(C\) 类型,手玩了一下,感觉是一直操作一定会有一次操作后使得 \(a_i = 2^k-1\),这个时候对面操作就会增加一次了。

所以总的代价是 \(ans = \sum_{i=1}^n\lfloor \log_2{a_i}\rfloor + \lfloor\frac{|B|}2\rfloor+|C|\)

也可以前缀和,我还是直接上线段树了。

关于更具体的上下界分析,参考[1]

点击查看代码
#include <bits/stdc++.h>using namespace std;using i64 = long long;template<class Info>
struct SegmentTree {int n;vector<Info> info;SegmentTree(): n(0) {}SegmentTree(int n_, Info v_ = Info()) {init(n_, v_);}template<class T>SegmentTree(vector<T> init_) {init(init_);}void init(int n_, Info v_ = Info()) {init(vector(n_, v_));}template<class T>void init(vector<T> init_) {n = init_.size();info.assign((4 << __lg(n) + 1) + 10, Info());function<void(int, int, int)> build = [&](int u, int l, int r) {if (l == r) {info[u] = init_[l - 1];return ;}i64 m = (l + r) / 2;build(2 * u, l, m);build(2 * u + 1, m + 1, r);pushup(u);};build(1, 1, n);}void pushup(int u) {info[u] = info[2 * u] + info[2 * u + 1];}void modify(int u, int l, int r, int x, const Info &v) {if (l == r) {info[u] = v;return;}int m = (l + r) / 2;if (x <= m) {modify(2 * u, l, m, x, v);} else {modify(2 * u + 1, m + 1, r, x, v);}pushup(u);}void modify(int u, const Info &v) {modify(1, 1, n, u, v);}Info rangeQuery(int u, int l, int r, int x, int y) {if (l > y || r < x) {return Info();}if (l >= x && r <= y) {return info[u];}int m = (l + r) / 2;return rangeQuery(2 * u, l, m, x, y) + rangeQuery(2 * u + 1, m + 1, r, x, y);}Info rangeQuery(int l, int r) {return rangeQuery(1, 1, n, l, r);}
};struct Info {int sum = 0, B = 0;
};Info operator+(const Info &l, const Info &r) {return {l.sum + r.sum + (l.B + r.B == 2), (l.B + r.B) % 2};
}void solve() {int n, q;cin >> n >> q;SegmentTree<Info> seg(n + 1);for(int i = 1; i <= n; i += 1) {int x;cin >> x;int k = 0;while((1 << k + 1) <= x) {k += 1;}int y = x - 1;bool B = (y == (y & -y)) && (x & 1);seg.modify(i, {k + ((x != (x & -x)) && !B), B});}while(q --) {int l, r;cin >> l >> r;cout << seg.rangeQuery(l, r).sum << "\n";}}
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin >> t;while (t--) {solve();}return 0;
}

E. Monotone Subsequence

明天补下题解


  1. https://codeforces.com/blog/entry/146988 ↩︎

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

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

相关文章

k8s之基础概念

1. k8s 架构K8s 属于经典的主从模型(Master-Slave 架构),由 Master 和 Node 节点构成:Master 节点:负责集群的管理,协调集群中的所有活动。例如应用的运行、修改、更新等。 Node 节点:为 Kubernetes 集群中的工…

Java基础 Day26 - 详解

Java基础 Day26 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &quo…

14_mklink创建符号链接

Win11中使用mklink创建符号链接完全指南 引言 在Windows 11系统中,文件和文件夹的管理是我们日常使用电脑的重要组成部分。有时候,我们希望能够在不移动实际文件的情况下,让文件或文件夹在多个位置"同时存在&q…

7_如何构建知识图谱

第一步:确定知识图谱的领域和范围 构建知识图谱的第一步是明确定义其目的、覆盖的领域和边界。这一步至关重要,因为它决定了整个项目的方向和复杂度。 1. 确定应用场景和目标问答系统:为特定领域提供智能问答服务 搜…

点双连通分量例题:矿场搭建

洛谷P3225 矿场搭建 据说点双连通分量的题少,而矿场搭建就是其中的一道好题,老师简单讲了一下我也是套板子AC了 题面具体点链接看,大概就是要求在无向图上修最少的救援点使得任意一个点坍塌了之后,剩下的点都能走走…

MTK oppoR9m Smart Phone flash Tool 提示 ERROR: STATUS_UNSUPPORT_CTRL_CODE (0xC0010004)

前言全局说明在使用 SP flash tool 刷机时,提示 ERROR: STATUS_UNSUPPORT_CTRL_CODE (0xC0010004)错误注意:刷机,会丢失用户:照片、聊天等信息资料。请备份基带等信息。请慎重刷机 !!! 注意:刷机,会丢失用户:照…

我开发的 Chrome 插件 SEO Tools Extension 今天上线了

我开发的 Chrome 插件 SEO Tools Extension 今天上线了 10月3日晚上向 Chrome 应用商店提交的浏览器扩展 SEO Tools Extension 今天下午通过审核并上线了。这个插件就是一些常用的 SEO工具集合,帮助站长做好网站SEO优…

Windows Server部署Vue3+Spring Boot项目 - 实践

Windows Server部署Vue3+Spring Boot项目 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

WPF ContentControl Content Binding

Install-Package Microsoft.Extensions.DependencyInjection; Install-Package CommunityToolkit.mvvm; <Window x:Class="WpfApp25.Views.MainWin"xmlns="http://schemas.microsoft.com/winfx/2006…

做网站什么程序好东莞互联网公司排名

ArcGIS Pro SDK &#xff08;九&#xff09;几何 3 点 文章目录 ArcGIS Pro SDK &#xff08;九&#xff09;几何 3 点1 构造地图点2 地图点生成器属性3 地图点的相等性4 缩放至指定点 环境&#xff1a;Visual Studio 2022 .NET6 ArcGIS Pro SDK 3.0 1 构造地图点 // 使用生…

南京专业做网站公司地址查公司信息在哪里查

分布式架构中实现全局唯一ID的需求非常常见,业界上也有很多的工具可直接使用。以下总结一下在面试过程中被问到如何使用Redis 实现分布式全局唯一ID的问题 自定义全局唯一ID生成器 @Component public class RedisIdWorker {/*** 开始时间戳*/private static final long BEGIN…

男女生做恶心的网站网站后期维护管理

本帖最后由 神经病的春天 于 2014-9-18 15:36 编辑近来升级了一下主机&#xff0c;这样一来&#xff0c;终于能够拥有USB3.0和SATA3.0接口了&#xff0c;不过本人目前还木有SSD&#xff0c;所以尚无法完全发挥出这些接口的速度优势。 为了测试&#xff0c;上周的时候&#xff0…

学校网站建设责任书衡阳seo网站推广

1. DBoW3库介绍 DBoW3是DBoW2的增强版&#xff0c;这是一个开源的C库&#xff0c;用于给图像特征排序&#xff0c;并将图像转化成视觉词袋表示。它采用层级树状结构将相近的图像特征在物理存储上聚集在一起&#xff0c;创建一个视觉词典。DBoW3还生成一个图像数据库&#xff0c…

To PXS -- Words to be remembered 2025.10.5

To PXS Despite the great distance between us, our hearts still unite as one. The powerful bond of friendship between us will never fade but endure. Looking back at the days and nights we shared togethe…

网站截图怎么做做网站要收订金吗

为了精准、稳定地提取滚动轴承故障特征&#xff0c;提出了基于变分模态分解和奇异值分解的特征提取方法&#xff0c;采用标准模糊C均值聚类(fuzzy C means clustering, FCM)进行故障识 别。对同一负荷下的已知故障信号进行变分模态分解&#xff0c;利用 奇异值分解技术进一步提…

⭐ Unity AVProVideo插件自带播放器 脚本重构 实现视频激活重置功能 - 实践

⭐ Unity AVProVideo插件自带播放器 脚本重构 实现视频激活重置功能 - 实践2025-10-05 21:56 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x:…

dede网站打开慢做采集网站赚钱

旧项目用的 vue3-seamless-scroll 怎么写都不生效&#xff0c;一看源码两年没更新了&#xff0c;不想调试&#xff0c;还是自己写吧&#xff0c;再不济问问GPT都会更快一点 scroll.vue <template><div class"scroll-container" ref"scrollContainerR…

网站做视频的软件营销型网站哪家好

课程背景 2023年&#xff0c;以ChatGPT为代表的接近人类水平的对话机器人&#xff0c;AIGC不断刷爆网络&#xff0c;其强大的内容生成能力给人们带来了巨大的震撼。学术界和产业界也都形成共识&#xff1a;AIGC绝非昙花一现&#xff0c;其底层技术和产业生态已经形成了新的格局…

做损坏文档的网站seo搜索引擎推广

更新Milvus各个组件的配置参数。 调试 您可以在OpenAPI Explorer中直接运行该接口&#xff0c;免去您计算签名的困扰。运行成功后&#xff0c;OpenAPI Explorer可以自动生成SDK代码示例。 ​编辑调试 授权信息 下表是API对应的授权信息&#xff0c;可以在RAM权限策略语句的…

做网站怎么选服务器军队采购网

java中各map中是否可以存储null值情况