Educational Codeforces Round 176 (Rated for Div. 2)

news/2025/3/18 1:54:30/文章来源:https://www.cnblogs.com/luckyblock/p/18778096

目录
  • 写在前面
  • A
  • B
  • C
  • D
  • E
  • 写在最后

写在前面

比赛地址:https://codeforces.com/contest/2075。

哈哈打成这个史样子还能上分啊。

A

签到。

奇数减奇数变偶数,偶数减偶数变偶数。则可以得到显然的操作次数上界,且可以证明一定能取到该上界:

  • \(n\) 为奇数:\(1 + \left\lceil \frac{n - k}{k - 1}\right\rceil\)
  • \(n\) 为偶数:\(\left\lceil \frac{n}{k - 1}\right\rceil\)
#include <bits/stdc++.h>
#define LL long longint main() {std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T; std::cin >> T;while (T --) {int n, k, ans; std::cin >> n >> k;if (n % 2) {ans = 1 + ceil(1.0 * (n - k) / (k - 1));} else {ans = ceil(1.0 * n / (k - 1));}std::cout << ans << "\n";}return 0;
}

B

讨论。

题面写的好怪呃呃两个 Announcement 发完才会做。

手玩容易发现,当 \(k\ge 2\) 时,最后一定可以取到数列中前 \(k+1\) 大的贡献。仅需初始时保证选择前 \(k+1\) 大中最靠左和最靠右的数即可;当 \(k=1\) 时,最后获得贡献的数一定是 \(a_1\)\(a_n\),则需要讨论最大值是否是 \(a_1\)\(a_n\)

  • \(\max a \in \{a_1, a_n\}\),则初始时选择次大值一定最好,答案为最大值与次大值之和;
  • 否则,初始时选择最大值一定最好,答案为最大值加上 \(\max(a_1, a_n)\)
#include <bits/stdc++.h>
#define LL long longconst int kN = 5010;int n, k;struct Data {int x, p;
} a[kN];bool cmp(Data fir_, Data sec_) {return fir_.x > sec_.x;
}int main() {std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T; std::cin >> T;while (T --) {std::cin >> n >> k;for (int i = 1; i <= n; ++ i) {std::cin >> a[i].x;a[i].p = i;}std::sort(a + 1, a + n + 1, cmp);LL ans = 0;if (k == 1) {if (a[1].p == 1 || a[1].p == n) {ans = a[1].x + a[2].x;} else {for (int i = 2; i <= n; ++ i) if (a[i].p == 1 || a[i].p == n) ans = std::max(ans, 1ll * a[1].x + a[i].x);}} else {for (int i = 1; i <= k + 1; ++ i) ans += a[i].x;}std::cout << ans << "\n";}return 0;
}
/*
1
5 2
1 2 3 4 11
5 1
1 1 5 1 21
5 1
5 1 1 1 1
*/

C

双指针,线段树。

我的做法比较大力。

先对 \(a\) 排序,然后正序枚举涂色时涂在前一半的颜色 \(i\),则能与颜色 \(i\) 组合成合法方案的颜色,在 \(a\) 中一定对应一段后缀 \([j, n]\)(可以为空),且当 \(i\) 递增时 \(j\) 一定递减。

于是考虑双指针维护上述的 \(i, j\),容易发现当前枚举到的前一半的颜色 \(i\),涂色数量分别为 \(x\in [1, a_i]\) 时,对应的合法方案数即为:

\[\sum_{j\le y\le n, y\not= i} \sum_{x\in[1, a_i]} [a_y\ge n - x] \]

发现上式即为若干个后缀 \([n - a_y, n - 1]\) 与前缀 \([1, x]\) 的交集长度之和,很容易通过权值线段树维护。考虑每次 \(j\) 左移时令区间 \([n - a_j, n - 1]\) 加一,上式的答案即为减去 \(i\) 的贡献后,区间 \([1, a_i]\) 的和。

总时间复杂度 \(O(n\log n)\) 级别。

#include <bits/stdc++.h>
#define LL long longconst int kN = 2e5 + 10;int n, m, a[kN];namespace Seg {#define ls (now_<<1)#define rs (now_<<1|1)#define mid ((L_+R_)>>1)LL sum[kN << 2], tag[kN << 2];void Pushup(int now_) {sum[now_] = sum[ls] + sum[rs];}void Pushdown(int now_, int L_, int R_) {sum[ls] += 1ll * tag[now_] * (mid - L_ + 1);sum[rs] += 1ll * tag[now_] * (R_ - mid);tag[ls] += tag[now_];tag[rs] += tag[now_];tag[now_] = 0ll;}void Build(int now_, int L_, int R_) {sum[now_] = 0, tag[now_] = 0ll;if (L_ == R_) return ;Build(ls, L_, mid);Build(rs, mid + 1, R_);Pushup(now_); }void Modify(int now_, int L_, int R_, int l_, int r_, LL val_) {if (l_ <= L_ and R_ <= r_) {sum[now_] += 1ll * (R_ - L_ + 1) * val_;tag[now_] += val_;return ;}Pushdown(now_, L_, R_);if (l_ <= mid) Modify(ls, L_, mid, l_, r_, val_);if (r_ > mid) Modify(rs, mid + 1, R_, l_, r_, val_);Pushup(now_);}LL Query(int now_, int L_, int R_, int l_, int r_) {if (l_ <= L_ and R_ <= r_) return sum[now_];Pushdown(now_, L_, R_);LL ret = 0;if (l_ <= mid) ret += Query(ls, L_, mid, l_, r_);if (r_ > mid) ret += Query(rs, mid + 1, R_, l_, r_);return ret;}#undef ls#undef rs#undef mid
}int main() {std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T; std::cin >> T;while (T --) {std::cin >> n >> m;for (int i = 1; i <= m; ++ i) std::cin >> a[i];std::sort(a + 1, a + m + 1);Seg::Build(1, 1, n);LL ans = 0;for (int i = 1, j = m + 1; i <= m; ++ i) {while (1 <= j - 1 && a[i] + a[j - 1] >= n) {-- j;Seg::Modify(1, 1, n, n - a[j], n - 1, 1);}if (i >= j) Seg::Modify(1, 1, n, n - a[i], n - 1, -1);ans += Seg::Query(1, 1, n, 1, a[i]);if (i >= j) Seg::Modify(1, 1, n, n - a[i], n - 1, 1);}std::cout << ans << "\n";}return 0;
}
/*
1
12 3
5 9 8
*/

D

预处理,DP,枚举。

唉唉写到这题的时候才来手感太坏了。

发现一次操作相当于以 \(2^k\) 的代价,选择一个数右移 \(k\) 位。最终两个数相等,等价于两个数通过若干次右移之后变成了某两个相等的前缀。发现 \(x, y\le 10^{17}\),则右移总次数并不多,于是考虑大力枚举两个数分别右移的次数 \(j, k\),并检查对应的前缀是否相等,并求得所需代价即可。

考虑预处理 \(f_{i, j, k}\) 表示使用操作 \(k\in[1, i]\),使得 \(x\) 右移 \(j\) 位,\(y\) 右移 \(k\) 位所需的最小代价。初始化 \(f_{0, 0, 0}=0\),则很容易得到一个类似 01 背包的转移:

\[f_{i, j, k} \leftarrow \begin{cases}f_{i - 1, j, k}\\f_{i - 1, j - i, k} + 2^i\\f_{i - 1, j, k - i} + 2^i \end{cases}\]

上式显然可以滚动数组优化成 \(f_{j, k}\),则可以在 \(O(\log^2 v)\) 的空间复杂度、\(O(\log^3 v)\) 的时间复杂度内预处理;则对于每次询问 \(x, y\),仅需大力枚举分别右移的次数 \(j, k\) 并检查对应的前缀是否相等,取合法的 \(f_{j, k}\) 的最小值即可。

单组询问时间复杂度为 \(O(\log x \log y)\) 级别,则总时间复杂度 \(O\left(\log^3 v + T\log^2 v\right)\) 级别。

#include <bits/stdc++.h>
#define LL long longconst int kN = 70 + 10;
const LL kInf = 1e18;
const int lim = 60;LL x, y;
LL f[2][kN][kN];int main() {std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T; std::cin >> T;for (int j = 0; j <= lim; ++ j) {for (int k = 0; k <= lim; ++ k) {f[0][j][k] = f[1][j][k] = kInf;}}int p = 1;f[0][0][0] = 0;    for (int i = 1; i <= std::max(lim, lim); ++ i, p ^= 1) {for (int j = lim; ~j; -- j) {for (int k = lim; ~k; -- k) {f[p][j][k] = f[p ^ 1][j][k];}}for (int j = lim; ~j; -- j) {for (int k = lim; k >= i; -- k) {f[p][j][k] = std::min(f[p][j][k], f[p ^ 1][j][k - i] + (1ll << i));}}for (int k = lim; ~k; -- k) {for (int j = lim; j >= i; -- j) {f[p][j][k] = std::min(f[p][j][k], f[p ^ 1][j - i][k] + (1ll << i));}}}while (T --) {std::cin >> x >> y;int limx = ceil(log2(1.0 * x + 1)) + 1, limy = ceil(log2(1.0 * y + 1)) + 1;LL ans = kInf;for (int j = 0; j <= limx; ++ j) {for (int k = 0; k <= limy; ++ k) {if ((x >> j) == (y >> k)) ans = std::min(ans, f[p ^ 1][j][k]);}}std::cout << ans << "\n";}return 0;
}

E

牛逼提。

显然当 \(a, b\) 两个数组中,某一方权值种类数为 1 时一定合法,这部分答案很容易球的;某一方权值种类数大于 2 时一定不合法;则重点是考虑两方权值种类数均为 2 时的合法性。

记此时两个数组的权值分别为:\(a_1, a_2, b_1, b_2(a_1\not= a_2, b_1, \not= b_2)\),此时矩阵中一共有四种权值:\(a_1\oplus b_1, a_1\oplus b_2, a_2\oplus b_1, a_2\oplus b_2\),且根据异或的性质,容易推出合法的充要条件为:

\[a_1 \oplus a_2 = b_1 \oplus b_2 \]

然后不会了,看别人代码发现可以直接拆位求出来分别在两个数组中选出符合条件的权值的种类数,起床再补。

写在最后

学到了什么:

  • D:枚举;

然后是好久没干的夹带私货,这次放个经典老番:

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

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

相关文章

助记词-公私钥-子私钥派生-钱包地址原理及实现

0x01.简介 现在各种DEX、钱包插件中的钱包导入及创建,大部分是通过助记词来备份的; 助记词是明文私钥的一种表现形式,最早由BIP39提出,为了帮助用户记住复杂的私钥; 一组助记词可以生成各个链上的公私钥,进而可以算出钱包地址;掌握了助记词,就代表掌握了该组助记词上的…

AI 代理的未来是事件驱动的

AI 代理即将彻底改变企业运营,它们具备自主解决问题的能力、适应性工作流以及可扩展性。但真正的挑战并不是构建更好的模型。 代理需要访问数据、工具,并且能够在不同系统之间共享信息,其输出还需要能被多个服务(包括其他代理)使用。这不是一个 AI 问题,而是一个基础设施…

树莓派 3B + Bookworm:mjpg-streamer 正确安装全流程(原创)

在树莓派 OS Bookworm 版本上安装 mjpg-streamer 并非像旧版本一样简单,许多网上的教程已经过时,甚至存在错误。我在尝试过程中遇到了多个问题,例如依赖库缺失、编译失败等,但最终成功解决并搭建了 远程视频流监控系统。本教程基于 树莓派 3B,整理了一套 完整、可复现 的 …

1.匀速圆周运动

1.平面中的匀速圆周运动 例子:一个物体在半径为r的圆形路径中以恒定大小的速度s移动。 建立一个二维坐标系,物体位于平面上,圆心在原点上。物体的瞬时速度v(t)总是与其运动轨迹相切,所以物体任意时刻的速度与轨迹圆相切,并且速度的大小:$|v(t)|=s$ 下图右侧的两个三角形,…

Fiddler如何抓取HTTPS请求

如果发现fiddler只能抓取http请求,但是抓取不到HTTPS请求,看查看是不是没有勾选解密https流量入口:Tools——>Options——>HTTPS,勾选以下选框设置完成过后可以正常抓取HTTPS的请求了

愿景2025|未来已来 各地未来产业加速布局

各地2025年政府工作报告显示,从东部沿海到中西部内陆,从人工智能到低空经济,从量子科技到生物制造,新兴产业和未来产业的布局正在加速展开,这些产业不仅成为各地抢占发展新赛道的重要抓手,更是推动经济高质量发展的新增长极。

Fiddler工具无法抓取请求的几种原因

1、设置了过滤: fiddler中支持我们设置过滤条件,这样fiddler就不会抓取所有的请求,比如我们要抓取一个指定ip地址的请求,就可以设置对应的过滤信息,但是结束过后可能忘记删除了,导致下一次使用fiddler的时候抓不到请求。 1、首先进入Fiddler界面 2、点击Filters,如果设置…

使用 INFINI Gateway 保护 Elasticsearch 集群之修改查询不合理参数(二)

本文将探讨如何使用 INFINI Gateway 修改查询不合理的参数,此方法同样适用于 Opensearch 和 Easysearch 。 在之前的文章中,我们介绍了如何使用 request_body_json_set 处理器修改不合理的查询参数,本篇将继续探讨如何使用 request_body_regex_replace 处理器修改不合理参数…

11判断

C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。判断语句语句 描述if 语句 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。if...else 语句 一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。嵌套 if 语句 您可以在一个…

2.4G 5G 频率 Wi-Fi 信道 All In One

2.4G & 5G 频率 Wi-Fi 信道 All In One2.4G & 5G 频率 Wi-Fi 信道 All In One demos荣耀路由 XD28Wi-Fi 信道:以无线信号作为传输媒体的数据信号传送通道,若选“自适应”,则路由器会根据周围环境选择一个最好的信道。 模式:设置路由器的无线工作模式。2.4G Wi-Fi 推…

win系统部署deepseek、ollama,修改模型路径

安装ollama 1、ollama官网下载对应版本的安装包:https://ollama.com/download 2、ollama默认安装到C盘,如果希望自定义安装路径,可以考虑该命令:OllamaSetup.exe /DIR=路径, 比如我想安装到D:\ollama文件下,我要在D盘下创建ollama文件夹,并将Ollama的安装包放在里面,然…