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

news/2025/10/4 14:12:29/文章来源:https://www.cnblogs.com/maburb/p/19125181

A. Increase or Smash

题意:你有一个全\(0\)数组,每次可以使得数组全部加上一个数或者使得某些位置变为\(0\)。求变成\(a\)的最小操作数。

最少的操作方案是,先把\(a\)去重后排序,然后从大到小每次加\(a_i - a_{i-1}\),然后把小于\(a_i\)的位置都变成\(0\)。这样等于\(a_i\)的位置就总共加上了\(a_i - a_{i-1} + a_{i-1} - a_{i-2} ...\)。最后就等于\(a_i\)。然后最后一步是直接加最小值就变成了\(a\)数组,不需要再把一些位置变成\(0\)。所有操作数就是\(2\)乘种类数减一。

点击查看代码
#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];}std::set<int> s(a.begin(), a.end());std::cout << (int)s.size() * 2 - 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;
}

B. Catching the Krug

题意:一个\((n+1) \times (n + 1)\)的网格,有两个人分别在\((x_1, y_1), (x_2, y_2)\)。第二个人要抓第一个人。第一个人只能上下左右移动,第二个人还可以斜着移动。两个人都不能出界。求回合数。

如果不考虑第一个人移动,则有\(\max(|x_1 - x_2|, |y_1 - y_2|)\)回合。
现在考虑第一个人移动,那么它横纵坐标移动的方向是固定的,肯定是朝远离第二个人的方向,于是可以计算出其横纵坐标分别多少步到边界。那么第一个人肯定一直走一个坐标是最优的,于是两个坐标可以走的距离取一下最大值。注意特判一下两个人有一个坐标相同的情况。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n;i64 x1, y1, x2, y2;std::cin >> n >> x1 >> y1 >> x2 >> y2;i64 dx = x1 <= x2 ? x1 : n - x1;i64 dy = y1 <= y2 ? y1 : n - y1;i64 X = std::abs(x1 - x2), Y = std::abs(y1 - y2);i64 ans = 0;if (x1 == x2) {ans = Y + dy;} else if (y1 == y2) {ans = X + dx;} else {ans = std::max(X + dx, Y + dy);}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;
}

C. Triple Removal

题意:一个\(01\)数组的代价为,每次选择三个相同元素,位置为\(i, j, k\)。花费\(\min(j - i, k - j)\)的代价。然后这三个位置被删除,一直到把整个数组删掉。给你一个\(01\)数组,每次询问其一个子数组的代价。

首先\([l, r]\)这个子数组\(0\)的个数和\(1\)的个数都应该是\(3\)的倍数。
然后考虑一个数组的代价,发现除了\(010101\)这种\(01\)交替的数组,每次操作选择的三个位置里都可以有两个是相邻的,也就是代价为\(1\)。而\(01\)交替的情况,第一次操作代价为\(2\),其余操作也为\(1\)了。那么只需要判断这个子数组是不是\(01\)交替的就行,可以前缀和记录\(a_i = a_{i+1}\)的个数。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n, q;std::cin >> n >> q;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}std::vector<int> sum0(n + 1), sum1(n + 1), sum(n + 1);for (int i = 0; i < n; ++ i) {sum0[i + 1] = sum0[i] + (a[i] == 0);sum1[i + 1] = sum1[i] + (a[i] == 1);sum[i + 1] = sum[i];if (i + 1 < n && a[i] == a[i + 1]) {sum[i + 1] += 1;}}while (q -- ) {int l, r;std::cin >> l >> r;if ((sum0[r] - sum0[l - 1]) % 3 || (sum1[r] - sum1[l - 1]) % 3) {std::cout << -1 << "\n";continue;}int ans = (r - l + 1) / 3;if (sum[r - 1] - sum[l - 1] == 0) {ans += 1;}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. Division Versus Addition

题意:一个数组,两个人玩游戏。第一个人每次把一个数除二(向下取整)。第二个人每次把一个数加一。两个人每次只能操作大于\(1\)的数。当所有数都变成\(1\)游戏结束。第一个人想尽快结束,第二个人想慢点结束。每次求一个子数组的回合数。

考虑有哪些数可以使得回合数多一,有两种情况,一种是需要从一开始就一直加一,例如\(3, 5\)这种,还有被除多个\(2\)后会变成第一种数,这样第二个人变成先手,可以使得这个数回合数加一,例如\(7, 10\)这种。

那么记录一下这两种数的个数的前缀和。记子数组里原来数字的操作总数为\(sum\),第一种数个数为\(sum1\),第二种数个数为\(sum2\),那么第一个人肯定先把第一种数除二,然后第二个人把剩下的第一种数加一,也就是它们优先操作第一种数后,那么第一个人会除掉\(\lceil \frac{sum1}{2} \rceil\)次,第二个可以使得\(\lfloor \frac{sum1}{2} \rfloor\)个这类数回合加一。然后剩下的操作就都可以给第二种数了,可以增加\(\min(sum - \lceil \frac{sum1}{2} \rceil, sum2)\)回合。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n, q;std::cin >> n >> q;std::vector<i64> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}std::vector<i64> sum(n + 1), sum1(n + 1), sum2(n + 1);for (int i = 0; i < n; ++ i) {sum[i + 1] = sum[i] + std::__lg(a[i]);sum1[i + 1] = sum1[i];sum2[i + 1] = sum2[i];int f = 0;int x = a[i] / 2;while (x > 1) {x += 1;f |= (1ll << std::__lg(x)) == (x);x /= 2;}sum2[i + 1] += f;if (f) {continue;}x = a[i];f = 0;while (x > 1) {x += 1;f |= (1ll << std::__lg(x)) == (x);x /= 2;}sum1[i + 1] += f;}while (q -- ) {int l, r;std::cin >> l >> r;i64 v = sum[r] - sum[l - 1];i64 ans = v;i64 s = sum1[r] - sum1[l - 1];v -= (s + 1) / 2;ans += s / 2;ans += std::min(v, sum2[r] - sum2[l - 1]);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;
}

E. Monotone Subsequence

题意:交互题。有一个\(n\),和一个隐藏的长度为\(n^2+1\)的排列\(p\)。你每次可以问一个子序列,然后会回答你有哪些位置是前缀最大的数。最多问\(n\)次,求一个长度为\(n+1\)的单调子序列。

一开始全问,然后每次把上一次得到的序列删掉继续问。中间有长度大于等于\(n+1\)的直接输出。如果直接没有递增大于等于\(n+1\)的序列,则一定有一个递减超过\(n+1\)的序列。因为我们可以每次根据回答得到一些位置大小关系,我们从前面的位置向后面比它小的位置连边,因为每次回答长度最多为\(n\),那么可以问满\(n\)次,因为每次把之前的回答删掉了,那么当前询问的位置前面一定有位置比它大,而这些位置后面有比他小的,然后又\(n\)次连边,这样就有\(n\)条边,就有\(n+1\)个点。只需要最后做\(dfs\)\(bfs\)求一下方案就行。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;std::vector<int> ask(std::vector<int> a) {std::cout << "? " << a.size();for (auto & x : a) {std::cout << " " << x;}std::cout << std::endl;int k;std::cin >> k;std::vector<int> res(k);for (auto & x : res) {std::cin >> x;}return res;
}void answer(std::vector<int> a) {std::cout << "!";for (auto & x : a) {std::cout << " " << x;}std::cout << std::endl;
}void solve() {int n;std::cin >> n;int m = n * n + 1;std::vector<int> ans;std::set<int> s;for (int i = 1; i <= m; ++ i) {s.insert(i);}std::vector<std::vector<int>> adj(m + 1);std::vector<int> in(m + 1);for (int i = 0; s.size() > 0 && i < n && ans.size() < n + 1; ++ i) {std::vector<int> b(s.begin(), s.end());ans = ask(b);for (int i = 0; i < ans.size(); ++ i) {int j = i + 1 < ans.size() ? ans[i + 1] : m + 1;for (int k = ans[i] + 1; k < j; ++ k) {if (s.count(k)) {adj[ans[i]].push_back(k);++ in[k];}}}for (auto & x : ans) {s.erase(x);}}if (ans.size() >= n + 1) {while (ans.size() > n + 1) {ans.pop_back();}answer(ans);} else {ans.clear();std::queue<int> q;std::vector<int> d(m + 1), pre(m + 1);for (int i = 1; i <= m; ++ i) {if (in[i] == 0) {q.push(i);d[i] = 1;}}while (q.size()) {int u = q.front(); q.pop();for (auto & v : adj[u]) {if (d[v] < d[u] + 1) {d[v] = d[u] + 1;pre[v] = u;}if ( -- in[v] == 0) {q.push(v);}}}for (int i = 1; i <= m; ++ i) {if (d[i] == n + 1) {int x = i;while (x) {ans.push_back(x);x = pre[x];}break;}}if (ans.size() == 0) {ans.push_back(0);}std::ranges::reverse(ans);answer(ans);}
} 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.mzph.cn/news/927209.shtml

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

相关文章

有做数学题的网站吗网站专题二级页怎么做

第 1 章&#xff1a;Yarn资源调度器 思考&#xff1a; 1、如何管理集群资源&#xff1f; 2、如何给任务合理分配资源&#xff1f; Yarn是一个资源调度平台&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&#xff0c;而MapReduce等运…

软件工程第一次作业--关于未来规划和自我发展

这个作业属于哪个课程 202501 软件工程这个作业要求在哪里 <软件工程第一次团队作业>这个作业的目标 熟悉git协作和markdown语法,深入了解自己的能力并寻找发展方向学号 102301537一、团队网页 https://github.…

2025太阳能厂家推荐天津龙腾,太阳能热水系统,发电系统,光伏热系统,热水工程系统,预加热系统,中央热水系统,彩图发电系统,分户储水系统,分户计量系统推荐

2025 年国内新能源行业迎来高质量发展新阶段,光热与光伏技术协同应用成为主流趋势,政策持续推动可再生能源在建筑、工业等领域的深度渗透。随着 “双碳” 目标推进,市场对新能源综合解决方案的需求显著提升,不仅要…

集训模拟赛日志

因为要补题,所以开了这个,题目和代码什么存了看文件。 2025.10.1 T1 怎么这么难,好像比 T3,4 做的都久。 T3 是注意到合法区间左右端点递增,然后随便维护一下就行了,甚至可以多测询问子区间然后历史和。 T4 场上…

详细介绍:Nature Electronics:卡内基梅隆大学开放用于多模态皮肤反馈的皮肤贴附式触觉接口

详细介绍:Nature Electronics:卡内基梅隆大学开放用于多模态皮肤反馈的皮肤贴附式触觉接口pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impor…

网站设计 知识产权wordpress page id

3月29日 qt打包APP操作 1 先在windows shell 中下载打包软件Pylnstaller pip install pyinstaller2 先进入py项目所在的位置&#xff0c;再执行以下代码(我用的qt版本是PySide6可以根据自己的情况修改) pyinstaller s02.py --noconsole --hidden-import PySide6.QtXml3 因为…

1688 商品采集 API 调用全流程分享:从准备到实操 - 实践

1688 商品采集 API 调用全流程分享:从准备到实操 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

2025最新推荐化妆品代工公司排行榜:含 OEM / ODM / 一站式服务企业,助力品牌方精准选合作方

当前化妆品行业竞争愈发激烈,品牌方若想在市场中占据优势,选择靠谱的代工公司至关重要。但如今市面上化妆品代工企业数量繁杂,部分企业存在研发能力薄弱、生产标准不达标、服务体系不完善等问题,导致品牌方难以精准…

悟空博弈单元(WBUC)专题研究:面向可能性计算的结构化创新架构

悟空博弈单元(WBUC)专题研究:面向可能性计算的结构化创新架构1 引言:WBUC的诞生背景与范式迁移 在传统人工智能发展面临瓶颈的当下,一种全新的计算架构——悟空博弈单元(Wukong Bargaining Unit Chip,简称WBUC)…

完整教程:奢侈品牌限量版素材管理策略指南

完整教程:奢侈品牌限量版素材管理策略指南2025-10-04 14:01 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: blo…

郑州网站公司哪家好网站定制建设公司

1.网络拓扑图 2.规则 &#xff08;1&#xff09;允许 &#xff08;自己&#xff09;ping通内外网&#xff0c;内外网随便一个pc就可以. &#xff08;2&#xff09; 允许&#xff08;电信&#xff09;ping通内外网&#xff0c;内外网随便一个pc就可以 &#xff08;时间问题不做…

国内有什么网站浙江十大外贸公司

线性表存储结构分为顺序存储、链式存储。 顺序存储的优点&#xff1a; 顺序存储的缺点&#xff1a; 链表就是典型的链式存储&#xff0c;将线性表L &#xff08;a0,a1,a2,........an-1&#xff09;中个元素分布在存储器的不同存储块&#xff0c;成为结点&#xff08;Node&…

做导购网站赚钱吗WordPress相册插件pro

项目展示 三栏布局是一种常用的网页布局结构。 除了头部区域、底部区域外&#xff0c;中间的区域&#xff08;主体区域&#xff09;划分成了三个栏目&#xff0c;分别是左侧边栏、内容区域和右侧边栏&#xff0c;这三个栏目就构成了三栏布局。当浏览器的宽度发声变化时&#x…

新手学做网站内容网站备案周期

摘要 https://arxiv.org/pdf/2312.07526.pdf 实时多人姿态估计在平衡速度和精度方面提出了重大挑战。虽然两阶段自上而下的方法随着图像中人数增加而变慢&#xff0c;但现有的单阶段方法往往无法同时提供高精度和实时性能。本文介绍了RTMO&#xff0c;这是一种单阶段姿态估计框…

3小时入门Python无人机编程课程 包含4个项目:监控无人机,人脸跟踪飞行和无人机寻线等(2021最新教程)

3小时入门Python无人机编程课程 包含4个项目:监控无人机,人脸跟踪飞行和无人机寻线等(2021最新教程)资料: https://www.youtube.com/watch?v=LmEcyQnfpDA https://www.bilibili.com/video/BV12X4y1T7WD/https://w…

网站开发用到的虚拟机有哪些商城展示网站建设

轻量可靠的小程序UI组件库&#xff0c;主流移动组件库 Vant 的微信小程序版本。Vant Weapp 和 Vant 的区别之前推荐过的移动端web组件库 Vant 是 Vue.js 版本的&#xff0c;其对内承载了有赞所有核心业务&#xff0c;对外有十多万开发者在使用&#xff0c;一直是业界主流的移动…

CopilotKit

CopilotKit https://docs.copilotkit.ai/ https://github.com/copilotkit/copilotkitWhat is CopilotKit?CopilotKit is the easiest way to add AI copilots - intelligent, context-aware assistants - into your a…

站群系统源码怎么看一个网站是什么时候做的

背景&#xff1a; 项目升级&#xff0c;引入MySQL数据库&#xff0c;之前一直用的是Oracle数据&#xff0c;在做用户登录单位维护的时候&#xff0c;需要返回该用户所属单位下的所有子单位。下边是模拟项目数据实践的过程。 数据准备&#xff1a; 准备一张单位表&#xff0c…

ag-ui

ag-ui https://github.com/ag-ui-protocol/ag-ui?tab=readme-ov-file AG-UI: The Agent-User Interaction Protocol AG-UI is an open, lightweight, event-based protocol that standardizes how AI agents connect …

SCCPC2021重现赛

I Rock Paper Scissors 考场上先看到了 T ≤ 1e3 然后开始质疑贪心算法的正确性。两位队友打完后都WA了,我也没想出来哪有问题,重现赛就放过了这道题。等到下午调题的时候自己打了个贪心交上去,发现 WA on #4 ,输出…