Codeforces Round #668 (Div. 2)【ABCD】
比赛链接:https://codeforces.com/contest/1405
A. Permutation Forgery
题意
给出一个大小为 $n$ 的排列 $p$,定义
\begin{equation} F(p)=\mathrm{sort}([p_1+p_2,p_2+p_3,\ldots,p_{n-1}+p_n]) 。\nonumber \end{equation}
试找出一个不同于 $p$ 的 $p'$ 满足 $F(p') = F(p)$ 。
题解
反转 $p$ 即可。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++)
cin >> a[i];
reverse(a.begin(), a.end());
for (int i = 0; i < a.size(); i++)
cout << a[i] << " \n"[i == a.size() - 1];
}
return 0;
}
B. Array Cancellation
题意
给出一个大小为 $n$,满足 $\sum_{i=0}^{n-1} a_i = 0$ 的数组 $a$,每次可选择的操作如下:
- 选择 $i < j$,将 $a_i$ 减一,$a_j$ 加一,花费为 $0$
- 选择 $i > j$,将 $a_i$ 减一,$a_j$ 加一,花费为 $1$
问将 $a_i$ 均变为 $0$ 的最小花费是多少。
题解一
分别存储正数和负数的位置,然后贪心加双指针模拟。
代码
#include <bits/stdc++.h.>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<int> a(n);
vector<int> posi, nega;
for (int i = 0; i < n; i++) {
cin >> a[i];
if (a[i] > 0) posi.push_back(i);
if (a[i] < 0) nega.push_back(i);
}
int j = 0;
for (int i = 0; i < int(posi.size()); i++) {
while (a[posi[i]] > 0) {
while (j < int(nega.size()) and nega[j] < posi[i])
++j;
if (j == int(nega.size())) break;
int mi = min(a[posi[i]], -a[nega[j]]);
a[posi[i]] -= mi;
a[nega[j]] += mi;
if (a[nega[j]] == 0) ++j;
}
}
long long ans = 0;
for (int i = 0; i < n; i++)
if (a[i] > 0) ans += a[i];
cout << ans << "\n";
}
return 0;
}
题解二
最小负前缀的绝对值即为最少花费。
证明
对于最小负前缀,内部操作不会影响该负前缀的总和,涉及外部操作的最佳方案就是对负前缀加一,因为 $\sum_{i=0}^{n-1} a_i = 0$,所以此时后缀为正且绝对值与该负前缀相等,将二者各视为一个整体操作即可。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
long long ans = 0, cur = 0;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
cur += x;
ans = min(ans, cur);
}
cout << -ans << "\n";
}
return 0;
}
C. Balanced Bitstring
题意
如果一个偶数长 $k$ 的二进制串有 $\frac{k}{2}$ 个 $0$ 和 $1$,那么称这个二进制串为 $k$ 平衡串。给出一个由 $0,1,?$ 组成的字符串 $s$,$s$ 中的 $?$ 可被替换为 $0$ 或 $1$,判断 $s$ 是否可能为 $k$ 平衡串。
题解
因为共享中间的 $k-1$ 个字符,所以 $s_i = s_{i+k}$ 。
所以如果第一个 $k$ 长子串确定合法,则整个字符串确定合法。
另外还需枚举 $k$ 个起点并判断一开始的字符串中步长为 $k$ 的路径上的所有字符是否相同。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n, k;
cin >> n >> k;
string s;
cin >> s;
bool ok = true;
int zero = 0, one = 0;
for (int i = 0; i < k; i++) {
bool a0 = false, a1 = false;
for (int j = i; j < n; j += k)
if (s[j] != '?')
(s[j] == '0' ? a0 : a1) = true;
if (a0 and a1)
ok = false;
else if (a0 or a1)
++(a0 ? zero : one);
}
if (max(zero, one) > k / 2)
ok = false;
cout << (ok ? "YES" : "NO") << "\n";
}
return 0;
}
D. Tree Tag
题意
给出一颗树,Alice在结点 $a$,每次可以走的距离最多为 $da$,Bob在结点 $b$,每次可以走的距离最多为 $db$,Alice先走,问在无限步内Alice能否走到Bob的位置。
题解
Alice获胜的三种情况:
- 一开始Bob在Alice的覆盖半径内,因为Alice先手,所以一步就可以走到Bob的位置
- Alice的覆盖直径大于等于树的直径,此时Alice可以移到树的中心并覆盖树上的每一个点
- Alice的覆盖直径大于等于Bob的步长,此时以Alice的起点为根节点,Bob无法超出Alice的覆盖范围移到另一颗子树
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n, a, b, da, db;
cin >> n >> a >> b >> da >> db;
--a, --b;
vector<vector<int>> G(n);
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
--u, --v;
G[u].push_back(v);
G[v].push_back(u);
}
int diam = 0;
vector<int> dep(n);
function<int(int, int)> dfs = [&](int u, int p) {
int len = 0;
for (auto v : G[u]) {
if (v != p) {
dep[v] = dep[u] + 1;
int cur = 1 + dfs(v, u);
diam = max(diam, cur + len);
len = max(len, cur);
}
}
return len;
};
dfs(a, -1);
cout << (2 * da >= min(diam, db) or dep[b] <= da ? "Alice" : "Bob") << "\n";
}
return 0;
}
Codeforces Round #668 (Div. 2)【ABCD】的更多相关文章
- Codeforces Round #682 (Div. 2)【ABCD】
比赛链接:https://codeforces.com/contest/1438 A. Specific Tastes of Andre 题意 构造一个任意连续子数组元素之和为子数组长度倍数的数组. ...
- Codeforces Round #678 (Div. 2)【ABCD】
比赛链接:https://codeforces.com/contest/1436 A. Reorder 题解 模拟一下这个二重循环发现每个位置数最终都只加了一次. 代码 #include <bi ...
- Codeforces Round #676 (Div. 2)【ABCD】
比赛链接:https://codeforces.com/contest/1421 A. XORwice 题意 给出两个正整数 \(a.b\),计算 \((a \oplus x) + (b \oplus ...
- Codeforces Round #675 (Div. 2)【ABCD】
比赛链接:https://codeforces.com/contest/1422 A. Fence 题意 给出三条边 $a,b,c$,构造第四条边使得四者可以围成一个四边形. 题解 $d = max( ...
- Codeforces Round #732 (Div. 2)【ABCD】
比赛链接:https://codeforces.com/contest/1546 A. AquaMoon and Two Arrays 题意 给出两个大小为 \(n\) 的数组 \(a, b\) ,每 ...
- Codeforces Round #677 (Div. 3)【ABCDE】
比赛链接:https://codeforces.com/contest/1433 A. Boring Apartments 题解 模拟即可. 代码 #include <bits/stdc++.h ...
- Codeforces Round #382 Div. 2【数论】
C. Tennis Championship(递推,斐波那契) 题意:n个人比赛,淘汰制,要求进行比赛双方的胜场数之差小于等于1.问冠军最多能打多少场比赛.题解:因为n太大,感觉是个构造.写写小数据, ...
- Codeforces Round #684 (Div. 2)【ABC1C2】
比赛链接:https://codeforces.com/contest/1440 A. Buy the String 题解 枚举字符串中 \(0\) 或 \(1\) 的个数即可. 代码 #includ ...
- Codeforces Round #658 (Div. 2)【ABC2】
做完前四题还有一个半小时... 比赛链接:https://codeforces.com/contest/1382 A. Common Subsequence 题意 给出两个数组,找出二者最短的公共子序 ...
随机推荐
- 如何优雅的传递 stl 容器作为函数参数来实现元素插入和遍历?
问题背景 开始正文之前,做一些背景铺垫,方便读者了解我的工程需求.我的项目是一个客户端消息分发中心,在连接上消息后台后,后台会不定时的给我推送一些消息,我再将它们转发给本机的其它桌面产品去做显示.后台 ...
- HP Proliant DL580 gen9 阵列卡P440AR 高速缓存 被禁用
摘录内容: IMPORTANT: This issue does NOT occur when the operating system shuts down gracefully. In addit ...
- 【Redis3.0.x】配置文件
Redis3.0.x 配置文件 概述 Redis 的配置文件位于Redis安装目录下,文件名为 redis.conf. 可以通过 CONFIG 命令查看或设置配置项. Redis 命令不区分大小写. ...
- 基于 MapReduce 的单词计数(Word Count)的实现
完整代码: // 导入必要的包 import java.io.IOException; import java.util.StringTokenizer; import org.apache.hado ...
- Loadrunner与kylinPET的能力对比测试--web动态请求
概述 在<性能测试工具选择策略--仿真度对比测评分析报告>一文详细分析了使用相同的web页面,分别使用LoadRunner,Jmeter,kylinTOP工具进行录制脚本并执行得出在静态请 ...
- 【Spring】Spring的数据库开发 - 1、Spring JDBC的配置和Spring JdbcTemplate的解析
Spring JDBC 文章目录 Spring JDBC Spring JdbcTemplate的解析 Spring JDBC的配置 简单记录-Java EE企业级应用开发教程(Spring+Spri ...
- 【System】进程,线程和任务之间的区别是什么?
任务(task)是最抽象的,是一个一般性的术语,指由软件完成的一个活动.一个任务既可以是一个进程,也可以是一个线程.简而言之,它指的是一系列共同达到某一目的的操作.例如,读取数据并将数据放入内存中.这 ...
- 【ORA】ORA-01033,ORA-09968,ORA-01102
[oracle@oracle ~]$ imp xxxx/user file=/usr/local/src/666.dmp full=y buffer=40960000 Import: Release ...
- Python eval 函数用途
Python eval 函数用途: eval 函数可将字符串转换成列表,元组和字典 实例如下: 可以把list,tuple,dict和string相互转化. ##################### ...
- 10_1_OS模块
1.常用函数目录 函数名 功能 os.name 指示用户正在使用的工作平台 os.getcwd ( ) 获取当前的工作目录 os.listdir ( ) 返回指定目录下的所有文件和目录名 os.rem ...