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 题意 给出两个数组,找出二者最短的公共子序 ...
随机推荐
- swack的wiki站上线
swack的个人wiki网址:www.swack.cn [服务器破旧,速度较慢,见谅!]
- Eslint提示const关键字被保留
如果在使用eslint的时候提示: error Parsing error: The keyword 'const' is reserved 有可能是因为eslint默认审查的es5,需要明确让他审查 ...
- ssh信任 sftp用法 scp用法【转】
为了进行批量关机工作,前提要配置好ssh的双机信任. A机192.168.1.241 B机192.168.1.212 在A机上获取一个pub密钥,即为公共密钥. 执行这个命令后:ssh-keygen ...
- 对微信小程序的生命周期进行扩展 – Typescript 篇
最近利用业余时间倒腾了一个微信小程序,主要目的是横向比较一些业界小程序平台的架构和做法.因为有在其他平台长期的开发经验,对于小程序的一些机制做了一些辩证的思考.例如,小程序的页面,其实不是一个页面,而 ...
- java环境配置-win10(傻瓜式教程)
java环境配置 – 小学弟要开始学java了,由于本人较懒,表达能力有限,所以来这,写一篇简单的指导,帮学弟装下java环境. 首先打开浏览器,输入这个网址https://www.oracle.co ...
- Centos 6.5 Rabbitmq 安装和集群,镜像部署
centos 6.5 rabbitmq 安装和集群,镜像部署 安装erlang: yum install gcc glibc-devel make ncurses-devel openssl-deve ...
- 温故而知新--day2
温故而知新--day2 类 类与对象 类是一个抽象的概念,是指对现实生活中一类具有共同特征的事物的抽象.其实列化后称为对象.类里面由类属性组成,类属性可以分为数据属性和函数属性(函数属性又称为类方法) ...
- 【Linux】find查找空文件夹
linux下批量删除空文件(大小等于0的文件)的方法 find . -name "*" -type f -size 0c | xargs -n 1 rm -f 就是删除1k大小的文 ...
- 【Oracle】11g direct path read介绍:10949 event、_small_table_threshold与_serial_direct_read
转自刘相兵老师的博文: http://www.askmaclean.com/archives/11g-direct-path-read-10949-_small_table_threshold-_se ...
- SAP里会话结束方法(杀死进程)
在SAP的ERP里,有很多方法可以结束一个会话,然而在不同情况下,需要使用的方法也不同.下面从先后顺序来简单说明:1.SM04:最常用的方法,在SM04点击工具栏的会话->结束会话,来关闭一个会 ...