Educational Codeforces Round 183 (Rated for Div. 2)

news/2025/10/7 1:05:58/文章来源:https://www.cnblogs.com/maburb/p/19128090

A. Candies for Nephews

题意:求大于等于\(n\)的最小\(3\)的倍数。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::cout << (n + 2) / 3 * 3 - n << "\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. Deck of Cards

题意:一副牌有\(n\)张,每次从顶拿一张或者从底拿一张,但有些操作你不确定是从哪拿的。求每张卡是一定被拿了还是一定没被拿还是不确定。

记录每个操作的数量,那么对于第\(i\)张卡,如果顶上或底下确定可以拿它,则必被拿。想要不被拿,需要顶上和底下各自加上不确定的数量都拿不到它。否则如果操作数小于\(n\)就是可能被拿。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n, k;std::cin >> n >> k;std::string s;std::cin >> s;int cnt[3]{};for (auto & c : s) {++ cnt[c - '0'];}std::string ans;for (int i = 1; i <= n; ++ i) {if (cnt[0] < i && cnt[1] <= n - i) {if (cnt[0] + cnt[2] < i && cnt[1] + cnt[2] <= n - i) {ans += '+';} else {if (cnt[0] + cnt[1] + cnt[2] == n) {ans += '-';} else {ans += '?';}}} else {ans += '-';}}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. Monocarp's String

题意:一个只包含\(ab\)的字符串,删去一个子区间使得\(ab\)数量相等,求区间最小长度。

\(a\)\(-1\)\(b\)\(1\)。那么我们需要删掉一个子区间满足其区间和为\(b\)的数量减\(a\)的数量。
可以前缀和做,用\(map\)存前面每个前缀值出现的最晚下标。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::string s;std::cin >> s;std::vector<int> sum(n + 1);for (int i = 0; i < n; ++ i) {sum[i + 1] = sum[i] + (s[i] == 'a' ? -1 : 1);}if (sum[n] == 0) {std::cout << 0 << "\n";return;}int ans = n;std::map<int, int> mp;mp[0] = 0;for (int i = 1; i <= n; ++ i) {if (mp.count(sum[i] - sum[n])) {ans = std::min(ans, i - mp[sum[i] - sum[n]]);}mp[sum[i]] = i;}if (ans == n) {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. Inversion Value of a Permutation

题意:构造一个长度为\(n\)的排列,使得其恰好有\(k\)个子数组不是升序。\(n \leq 30\)

先考虑倒着排:\(n, n - 1, n - 2, ... 1\),这样有\(\frac{n(n-1)}{2}\)个不是升序的区间。然后我们选择一个长度为\(l\)的子区间翻转的话,就使得满足条件的区间减少了\(\frac{l(l-1)}{2}\)。然后我们选择一些不相交的子区间翻转,这样我们可以凑出减少\(\frac{n(n-1)}{2} - k\)。但怎样凑也是有最优方案的,可以看作背包,重量为\(l\)的物品有\(\frac{l(l-1)}{2}\)的价值。求凑\(k\)价值的最小重量及其方案。
背包预处理即可。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;const int N = 30 * 30;int f[N], pre[N];void init() {for (int i = 1; i < N; ++ i) {f[i] = 1e9;for (int j = 2; j * (j - 1) / 2 <= i; ++ j) {if (f[i - j * (j - 1) / 2] + j < f[i]) {f[i] = f[i - j * (j - 1) / 2] + j;pre[i] = j;}}}
}void solve() {int n, k;std::cin >> n >> k;std::vector<int> ans(n);std::ranges::iota(ans, 0);std::ranges::reverse(ans);k = n * (n - 1) / 2 - k;for (int i = 0; i < n && k;) {int len = pre[k];if (i + len > n) {break;}std::reverse(ans.begin() + i, ans.begin() + i + len);k -= len * (len - 1) / 2;i += len;}if (k) {std::cout << 0 << "\n";} else {for (int i = 0; i < n; ++ i) {std::cout << ans[i] + 1 << " \n"[i == n - 1];}}
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;init();std::cin >> t;while (t -- ) {solve();}return 0;
}

E. Predicting Popularity

题意:一开始你有两个属性\(ac, dr\)。有\(n\)个人也有两个属性\(a_i, d_i\)。你可以一步一步吸收这些人,如果已经有\(p\)个人,那么如果一个人满足\(\max(0, a_i - ac) + \max(0, d_i - dr) \leq p\)他就会加入你。\(m\)次修改每次改一个人的\(a_i, d_i\),求可以有多少人。

\(cnt_k\)\(k = \max(0, a_i - ac) + \max(0, d_i - dr)\)的个数。记\(pre_i = \sum_{j=0}^{i-1} cnt_j\)。那么如果有\(pre_i \geq i\)则可以加入\(i\)个人。那么最大的所有\(pre_i\)都大于等于\(i\)的前缀长度就是答案。
现在考虑修改,记\(f_i = pre_i - i\)。那么最大的\(f_i\)大于等于\(0\)的前缀长度就是答案,可以用线段树维护\(f\)。修改一个人时先把他原来的贡献删掉,如果它的\(\max(0, a_i - ac) + \max(0, d_i - dr) = k\),那么\([k + 1, n + 1]\)\(f\)都要减一,\(k\)大于\(n\)就看作\(n+1\)
然后修改后同理把修改后对应的后缀都加一就行了。然后查询答案就是在线段树内二分。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;const int N = 5e5 + 5;int a[N], d[N];
int f[N];template <class Info, class Tag>
struct LazySegmentTree {struct Node {int l, r;Info info;Tag tag;};std::vector<Node> tr;LazySegmentTree() {}LazySegmentTree(int n) {init(n);}void init(int n) {tr.assign(n << 2, {});build(0, n - 1);}void pushdown(Node & u, const Tag & tag) {u.info = u.info + tag;u.tag = u.tag + tag;}void pushdown(int u) {if (tr[u].tag.exist()) {pushdown(tr[u << 1], tr[u].tag);pushdown(tr[u << 1 | 1], tr[u].tag);tr[u].tag.clear();}}void pushup(int u) {tr[u].info = tr[u << 1].info + tr[u << 1 | 1].info;}void build(int l, int r, int u = 1) {tr[u] = {l, r, {}};if (l == r) {tr[u].info.min = f[l];return;}int mid = l + r >> 1;build(l, mid, u << 1); build(mid + 1, r, u << 1 | 1);pushup(u);}void modify(int l, int r, const Tag & tag, int u = 1) {if (l <= tr[u].l && tr[u].r <= r) {pushdown(tr[u], tag);return;}pushdown(u);int mid = tr[u].l + tr[u].r >> 1;if (l <= mid) {modify(l, r, tag, u << 1);}if (r > mid) {modify(l, r, tag, u << 1 | 1);}pushup(u);}int query(int u = 1) {if (tr[u].l == tr[u].r) {return tr[u].info.min >= 0 ? tr[u].l : 0;}pushdown(u);if (tr[u << 1].info.min >= 0) {int mid = tr[u].l + tr[u].r >> 1;return std::max(mid, query(u << 1 | 1));} else {return query(u << 1);}}
};struct Info {int min;
};struct Tag {int add = 0;bool exist() {return add != 0;}void clear() {add = 0;}
};Info operator + (const Info & a, const Info & b) {Info res{};res.min = std::min(a.min, b.min);return res;
}Info operator + (const Info & a, const Tag & b) {Info res{};res.min = a.min + b.add;return res;
}Tag operator + (const Tag & a, const Tag & b) {Tag res{};res.add = a.add + b.add;return res;
}void solve() {int ac, dr;std::cin >> ac >> dr;int n;std::cin >> n;for (int i = 0; i < n; ++ i) {std::cin >> a[i];}for (int i = 0; i < n; ++ i) {std::cin >> d[i];}std::vector<int> cnt(n + 3);for (int i = 0; i < n; ++ i) {int v = std::max(0, a[i] - ac) + std::max(0, d[i] - dr);++ cnt[std::min(n + 1, v)];}int pre = 0;for (int i = 0; i <= n + 2; ++ i) {f[i] = pre - i;pre += cnt[i];}LazySegmentTree<Info, Tag> tr(n + 3);int m;std::cin >> m;while (m -- ) {int k, x, y;std::cin >> k >> x >> y;-- k;int last = std::max(0, a[k] - ac) + std::max(0, d[k] - dr);last = std::min(n + 1, last);tr.modify(last + 1, n + 2, Tag{-1});a[k] = x; d[k] = y;int now = std::max(0, a[k] - ac) + std::max(0, d[k] - dr);now = std::min(n + 1, now);tr.modify(now + 1, n + 2, Tag{1});std::cout << tr.query() << "\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;
}

F. Long Journey

题意:一个人从\(0\)走到\(m\)每步可以选择不动或者加一。有\(n\)个陷阱,第\(i\)个陷阱会在时刻\(t\)满足\(t \equiv i \pmod n\)时在所有\(k \times a_i + b_i\)的位置触发。不能碰到陷阱走到\(m\)需要多少步。\(n \leq 10, m \leq 10^{12}\)

记状态\(f[i][j]\)表示走到第\(i\)个格子时刻为\(j\)的最小步数,转移就是每次走下一个最小时刻\(k\)满足\(j\)等到\(k\)\(i\)个格子都是安全的,且下一步走到\(i+1\)也是安全的。显然太大了无法计算。考虑状态取下模。即\(f[i][j]\)表示第一次到\(x \equiv i \pmod {lcm(a_1, a_2, ..., a_n)}\)格,时刻为\(t \equiv j \pmod n\)的最小步数。然后猜测在这些转移里是有环的(真是猜的)。只需要找到这个环,就能计算了。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve(){int n;i64 m;std::cin >> n >> m;std::vector<int> a(n), b(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}for (int i = 0; i < n; ++ i) {std::cin >> b[i];}int L = 1;for(int i = 0; i < n; i++) {L = std::lcm(L, a[i]);}int N = L * n;std::vector<std::vector<int>> safe(L, std::vector<int>(n, 1));for(int x = 0; x < L; ++ x) {for(int t = 0; t < n; ++ t) {int i = (t - 1 + n) % n;if (x % a[i] == b[i]) {safe[x][t] = 0;}}}std::vector<int> f(N, -1);std::vector<i64> cost(N, 0);auto getNext = [&](int id) -> void {if (f[id] != -1) { return;}int x = id / n;int r = id % n;int best = -1;for(int w = 0; w < n; ++ w){bool ok = true;for(int k = 1; k <= w; ++ k){int t2 = (r + k) % n;if (!safe[x][t2]) {ok = false; break;}}if (!ok) {continue;}int rt = (r + w + 1) % n;int x2 = (x + 1 == L ? 0 : x + 1);if (safe[x2][rt]) {best = w;break;}}if (best < 0) {f[id] = -2;return;}i64 c = best + 1;int r2 = (r + best + 1) % n;int x2 = (x + 1 == L ? 0 : x + 1);int id2 = x2 * n + r2;f[id] = id2;cost[id] = c;};int id = 0;std::vector<i64> sum(N, 0);std::vector<i64> d(N, -1);i64 tot = 0;i64 step = 0;int cur = id;bool bad = false;while (step < m && d[cur] == -1) {d[cur] = step;sum[cur] = tot;getNext(cur);if (f[cur] == -2) {bad = true;break;}tot += cost[cur];cur = f[cur];step ++;}if (bad) {std::cout << -1 << "\n";return;}if (step == m) {std::cout << tot << "\n";return;}i64 cycle_len = step - d[cur];i64 cycle_cost = tot - sum[cur];i64 rem = m - d[cur];i64 cnt = rem / cycle_len;i64 ans = sum[cur] + cnt * cycle_cost;i64 rem2 = rem % cycle_len;for (i64 i = 0; i < rem2; ++ i) {getNext(cur);ans += cost[cur];cur = f[cur];}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;
}

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

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

相关文章

免费域名怎么做网站我想做代理商

SnowNLP: 一个简单的中文文本处理库 SnowNLP是一个python写的类库&#xff0c;可以方便的处理中文文本内容&#xff0c;是受到了TextBlob的启发而写的&#xff0c;由于现在大部分的自然语言处理库基本都是针对英文的&#xff0c;于是写了一个方便处理中文的类库&#xff0c;并且…

网站开发维护多少钱软件项目管理考试题及答案

maven打jar包错误 引起错误的原因是在 SpringbootStudyApplication 类中&#xff0c;加入了下面注释中的代码&#xff08;监听项目启动&#xff0c;然后打开浏览器&#xff09;&#xff0c;单纯删掉注释代码是无法解决问题的&#xff0c;可能的原因是由于加入这部分代码而impo…

做猎头要用的网站知乎超简单网页制作模板

文章目录1&#xff0e;命令格式2&#xff0e;命令功能3&#xff0e;命令参数4&#xff0e;命令实例1、文件改名&#xff08; 重命名&#xff09;2、移动文件3、将test目录下的文件text1.txt text2.txt text3.txt移动到目录mv中。4、将文件file1改名为file2&#xff0c;如果file…

长春网站建设那家好如何做网站活动

[js] 使用ajax请求真的不安全吗&#xff1f;为什么&#xff1f; AJAX是发送HTTP请求的一种方式&#xff0c;只不过浏览器给它加了一个同源策略而已。 所以从这一点可以得出一个结论&#xff1a;AJAX本质上安全性和HTTP请求一样个人简介 我是歌谣&#xff0c;欢迎和大家一起交…

广州网站优化工具服务静态网站注入

动态代理jdk的Proxy与Spring的CGlib 文章目录 动态代理jdk的Proxy与Spring的CGlib1. 为什么要使用动态代理&#xff1f;2. JDK Proxy 动态代理面向接口的动态代理3. CGlib动态代理4. 两个动态代理的区别 1. 为什么要使用动态代理&#xff1f; 动态代理&#xff1a;在不改变原有…

高三闲话 #2

“那你们现在坐在这,一定是失败了。”小食堂外面有一只猫,每天吃饭都可以看到它趴在那里,被投喂一些食物。不过我在它眼中看不到任何“乞食”的色彩,更像是在等待被“进贡”。我们每天吃完饭回去都要欣赏那只猫,G…

D. Inversion Value of a Permutation edu div2

题意:给出一个排列,其逆序值为:包含至少一个逆序对的子区间数量 给出n和k,要求构造一个长度为n的,逆序值为k的排列 很显然,如果一个排列内,若是有两个位置逆序,那么以这两个位置为起点,找到的所有子区间可能会…

Mineserver

Mineserverhttps://github.com/CoolManBob/mineserver 项目简介(根据 README)名称:Mineserver用途:一个 Minecraft Alpha(早期版 Minecraft) 的 自定义服务器软件,用 C++ 编写,支持 Windows 和 Linux 平台。Gi…

首钢建设二公司网站博客网站开发背景及作用

之前的表单验证都是用js写的&#xff0c;这里也可以使用tp框架的验证。但是两者比较而言还是js验证比较好&#xff0c;因为tp框架验证会运行后台代码&#xff0c;这样运行速度和效率就会下降。  自动验证是ThinkPHP模型层提供的一种数据验证方法&#xff0c;可以在使用create创…

个人博客公告

由于github部署的网站维护稍微有点繁琐(有点懒了更新了) 原来的域名gannia.top 已经到期了暂时还没有续费的打算(指香港云服务器不清楚怎么推掉域名,想要更换阿里云域名的) 目前暂时还是用着原来的域名 https://t…

一个刚大一的普通大学生

title: 一个刚大一的普通大学生 tags: [] categories:生活 author: Tokepson date: 2025-05-01 00:32:00关于我 一名正在山东上大学的普通大学生(虽然说是在上海成长的。。。) 在多次了解到个人网站领域的信息后,出…

通过利用百度对于外链的检测算法上的缺陷

友情链接欺骗,通过利用百度对于外链的检测算法上的缺陷,可以实现自己的网站所有对外的链接,被判定为“不是站长真正的去推荐”的外链,让百度自动过滤掉这类链接的计算分值。 第四种:快速排名,目前快速排名技术有…

用django做网站网站seo关键词排名推广

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

网站建设 我们是专业的网页制作的模块命名规范

描述 从日志中读取数据时&#xff0c;有一条数据不符合规范&#xff0c;导致logstash读取数据插入时出错&#xff0c;而插件又无限尝试插入&#xff0c;导致堵塞。 解决方案 找到logstash文件夹目录&#xff0c;例如是&#xff1a;/data/logstash-7.3.2 cd /data/logstash-…

网站开发报告参考文献wordpress 没有样式表

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Discord

DiscordDiscord 本质上是一个 免费语音、视频、文字社群软件,最早是为游戏玩家设计的,后来扩展成面向各种社区。 主要特点:语音/视频/文字聊天:实时语音频道、群聊、私聊。服务器(Server)+频道(Channel) 组织形…

网络上做假网站做物流安卓app开发环境

对拉索回归进行调参主要涉及确定最佳的正则化参数 λ。正则化参数 λ 控制着模型对系数的收缩程度&#xff0c;影响着模型的复杂度。选择合适的 λ 值既可以防止过拟合&#xff0c;也可以保证模型有足够的预测能力。 以下是进行拉索回归调参的一般步骤&#xff1a; 准备数据&a…

wordpress网站有支付功能吗公司网站是用什么软件做

[css] 你有用过弹性布局吗&#xff1f;说说你对它的理解 按我的经验在样式规律上大致分下类吧&#xff0c;等宽弹性布局单元素弹性布局多元素定比弹性布局等隙布局用 flex 或 grid 能非常轻松的完成以上效果&#xff0c;而 css2 时代多半还需要更多元素嵌套才能完成了。所谓弹…

git常用助记

基础 添加配置 git config [--local | --global | --system] user.name Your name git config [--local | --global | --system] user.email Your emaillocal 仓库级 2. global 用户级 3. system 系统级查看配置 git …

网站营销成功的案例分析加速游戏流畅的软件

dataloader中通常使用num_workers来指定多线程来进行数据的读取。可以使用共享内存进行加速。 代码地址&#xff1a;https://github.com/POSTECH-CVLab/point-transformer/blob/master/util/s3dis.py 文章目录 1. 共享内存和dataloader结合1.1 在init中把所有的data存储到共享内…