比赛链接: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】的更多相关文章

  1. Codeforces Round #682 (Div. 2)【ABCD】

    比赛链接:https://codeforces.com/contest/1438 A. Specific Tastes of Andre 题意 构造一个任意连续子数组元素之和为子数组长度倍数的数组. ...

  2. Codeforces Round #678 (Div. 2)【ABCD】

    比赛链接:https://codeforces.com/contest/1436 A. Reorder 题解 模拟一下这个二重循环发现每个位置数最终都只加了一次. 代码 #include <bi ...

  3. Codeforces Round #676 (Div. 2)【ABCD】

    比赛链接:https://codeforces.com/contest/1421 A. XORwice 题意 给出两个正整数 \(a.b\),计算 \((a \oplus x) + (b \oplus ...

  4. Codeforces Round #675 (Div. 2)【ABCD】

    比赛链接:https://codeforces.com/contest/1422 A. Fence 题意 给出三条边 $a,b,c$,构造第四条边使得四者可以围成一个四边形. 题解 $d = max( ...

  5. Codeforces Round #732 (Div. 2)【ABCD】

    比赛链接:https://codeforces.com/contest/1546 A. AquaMoon and Two Arrays 题意 给出两个大小为 \(n\) 的数组 \(a, b\) ,每 ...

  6. Codeforces Round #677 (Div. 3)【ABCDE】

    比赛链接:https://codeforces.com/contest/1433 A. Boring Apartments 题解 模拟即可. 代码 #include <bits/stdc++.h ...

  7. Codeforces Round #382 Div. 2【数论】

    C. Tennis Championship(递推,斐波那契) 题意:n个人比赛,淘汰制,要求进行比赛双方的胜场数之差小于等于1.问冠军最多能打多少场比赛.题解:因为n太大,感觉是个构造.写写小数据, ...

  8. Codeforces Round #684 (Div. 2)【ABC1C2】

    比赛链接:https://codeforces.com/contest/1440 A. Buy the String 题解 枚举字符串中 \(0\) 或 \(1\) 的个数即可. 代码 #includ ...

  9. Codeforces Round #658 (Div. 2)【ABC2】

    做完前四题还有一个半小时... 比赛链接:https://codeforces.com/contest/1382 A. Common Subsequence 题意 给出两个数组,找出二者最短的公共子序 ...

随机推荐

  1. 如何优雅的传递 stl 容器作为函数参数来实现元素插入和遍历?

    问题背景 开始正文之前,做一些背景铺垫,方便读者了解我的工程需求.我的项目是一个客户端消息分发中心,在连接上消息后台后,后台会不定时的给我推送一些消息,我再将它们转发给本机的其它桌面产品去做显示.后台 ...

  2. HP Proliant DL580 gen9 阵列卡P440AR 高速缓存 被禁用

    摘录内容: IMPORTANT: This issue does NOT occur when the operating system shuts down gracefully. In addit ...

  3. 【Redis3.0.x】配置文件

    Redis3.0.x 配置文件 概述 Redis 的配置文件位于Redis安装目录下,文件名为 redis.conf. 可以通过 CONFIG 命令查看或设置配置项. Redis 命令不区分大小写. ...

  4. 基于 MapReduce 的单词计数(Word Count)的实现

    完整代码: // 导入必要的包 import java.io.IOException; import java.util.StringTokenizer; import org.apache.hado ...

  5. Loadrunner与kylinPET的能力对比测试--web动态请求

    概述 在<性能测试工具选择策略--仿真度对比测评分析报告>一文详细分析了使用相同的web页面,分别使用LoadRunner,Jmeter,kylinTOP工具进行录制脚本并执行得出在静态请 ...

  6. 【Spring】Spring的数据库开发 - 1、Spring JDBC的配置和Spring JdbcTemplate的解析

    Spring JDBC 文章目录 Spring JDBC Spring JdbcTemplate的解析 Spring JDBC的配置 简单记录-Java EE企业级应用开发教程(Spring+Spri ...

  7. 【System】进程,线程和任务之间的区别是什么?

    任务(task)是最抽象的,是一个一般性的术语,指由软件完成的一个活动.一个任务既可以是一个进程,也可以是一个线程.简而言之,它指的是一系列共同达到某一目的的操作.例如,读取数据并将数据放入内存中.这 ...

  8. 【ORA】ORA-01033,ORA-09968,ORA-01102

    [oracle@oracle ~]$ imp xxxx/user file=/usr/local/src/666.dmp full=y buffer=40960000 Import: Release ...

  9. Python eval 函数用途

    Python eval 函数用途: eval 函数可将字符串转换成列表,元组和字典 实例如下: 可以把list,tuple,dict和string相互转化. ##################### ...

  10. 10_1_OS模块

    1.常用函数目录 函数名 功能 os.name 指示用户正在使用的工作平台 os.getcwd ( ) 获取当前的工作目录 os.listdir ( ) 返回指定目录下的所有文件和目录名 os.rem ...