Codeforces Round #572 (Div. 2)
Contest Info
[Practice Link](https://codeforc.es/contest/1189)
| Solved | A | B | C | D1 | D2 | E | F |
|---|---|---|---|---|---|---|---|
| 6/7 | Ø | Ø | Ø | Ø | Ø | Ø | - |
- O 在比赛中通过
- Ø 赛后通过
- ! 尝试了但是失败了
- - 没有尝试
Solutions
A. Keanu Reeves
签到题。
#include <bits/stdc++.h>
using namespace std;
#define N 1100
char s[N]; int n;
int main() {
while (scanf("%d%s", &n, s + 1) != EOF) {
int cnt = 0;
for (int i = 1; i <= n; ++i) {
if (s[i] == '1') ++cnt;
else --cnt;
}
if (cnt) {
puts("1"); puts(s + 1);
} else {
puts("2");
printf("%c %s\n", s[1], s + 2);
}
}
return 0;
}
B. Number Circle
题意:
有一个序列\(a_1, a_2, \cdots, a_n\),要求重新排列构成一个环,任意一个数都要满足严格小于旁边两数之和。
输出方案;
思路:
本来的想法是最大的放中间,次大,第三大的放旁边这样一次放下去,但是发现这样并不总能构造出解。
后来想想,直接降序排,那么其中除了最大的一个元素可能不满足,其他元素肯定都满足。
那么我们先降序排,有\(a_n, a_{n - 1}, \cdots, a_1\)
然后将\(a_{n - 1}\)移到最后一个,依然满足其他元素都满足,最大的那个元素可能不满足。
但是这个情况下,如果最大的元素都不满足,那肯定满足不了了,因为和最大的元素相邻的是次大的和第三大的。
代码:
#include <bits/stdc++.h>
using namespace std;
#define N 100010
int n, a[N], b[N];
bool ok(int *a) {
if (a[2] + a[n] <= a[1]) return 0;
if (a[1] + a[n - 1] <= a[n]) return 0;
for (int i = 2; i < n; ++i) {
if (a[i - 1] + a[i + 1] <= a[i]) {
return 0;
}
}
return 1;
}
int main() {
while (scanf("%d", &n) != EOF) {
for (int i = 1; i <= n; ++i) scanf("%d", a + i);
sort(a + 1, a + 1 + n, [](int x, int y) {
return x > y;
});
b[1] = a[1];
for (int i = 3; i <= n; ++i) b[i - 1] = a[i];
b[n] = a[2];
if (ok(b)) {
puts("YES");
for (int i = 1; i <= n; ++i) printf("%d%c", b[i], " \n"[i == n]);
} else {
puts("NO");
}
}
return 0;
}
C. Candies!
题意:
有\(n\)个数\(s_i(0 \leq s_i \leq 9)\),定义这样一种过程:
- 对于长度为\(2\)的幂次的子区间\([a_1, a_2, \cdots, a_{2^k}]\),每次替换\((a_{2i}, a_{2i + 1})(0 \leq i < 2^{k -1})\)为\((a_{2i} + a_{2i + 1}) \bmod 10\)。
- 如果某一步的\(a_{2i} + a_{2i + 1} >= 10\),那么会获得一个糖果
- 重复操作,知道序列中数的个数变为\(1\)。
每次询问\(f[a_1, a_2, \cdots, a_{2^k}]\)表示\([a_1, a_2, \cdots, a_{2^k}]\)这个区间执行上述操作最后得到的糖果个数是多少。
思路:
\(f[i][j]\)表示以第\(i\)位为起点,长度为\(j\)的区间的糖果个数多少,倍增即可。
代码:
#include <bits/stdc++.h>
using namespace std;
#define N 100010
#define D 20
int n, q, l, r, a[N];
int f[N][20], g[N][20];
int main() {
while (scanf("%d", &n) != EOF) {
memset(f, 0, sizeof f);
memset(g, 0, sizeof g);
for (int i = 1; i <= n; ++i) scanf("%d", a + i), g[i][0] = a[i];
for (int j = 1; j <= 20; ++j) {
for (int i = 1; i <= n; ++i) {
if (i + (1 << j) - 1 > n) break;
int nx = (i + (1 << (j - 1)));
f[i][j] = f[i][j - 1] + f[nx][j - 1];
g[i][j] = g[i][j - 1] + g[nx][j - 1];
if (g[i][j] >= 10) {
++f[i][j];
g[i][j] %= 10;
}
}
}
scanf("%d", &q);
while (q--) {
scanf("%d%d", &l, &r);
int t = r - l + 1, q = 0;
while (t) {
++q;
t /= 2;
}
--q;
printf("%d\n", f[l][q]);
}
}
return 0;
}
D1. Add on a Tree
题意:
有一棵树,每次可以选取两个叶子结点,将这两个叶子的简单路径上的所有边的边全加上\(x\)。
询问给定任意一种边权方案,是否都能通过有限次这种操作完成。
思路:
当且仅当树中没有度数为\(2\)的点的时候,可以。
代码:
#include <bits/stdc++.h>
using namespace std;
#define N 100010
int n, a[N], d[N];
int main() {
while (scanf("%d", &n) != EOF) {
memset(d, 0, sizeof d);
for (int i = 1, u, v; i < n; ++i) {
scanf("%d%d", &u, &v);
++d[u]; ++d[v];
}
bool F = 1;
for (int i = 1; i <= n; ++i) if (d[i] == 2) F = 0;
puts(F ? "YES" : "NO");
}
return 0;
}
D2. Add on a Tree: Revolution
题意:
和D1的不同之处在于每次加的\(x\)都是整数,而且这次给出边的需求边权,要求一种方案。并且边权都是偶数。
思路:
当且仅当树中没有度数为\(2\)的点的时候, 为什么?
首先,除了叶子结点意外以外,其他结点的度数都\(>= 3\)。 那么我们考虑其中一个点\(u\),有三个点\(l_1, l_2, v\)分别属于\(u\)的三个不同子树。
那么我们要想改变\((u, v)\)这条边的边权为\(x\),那么我们这么操作:
- \((g[v], g[l_1])\) 加 \(\frac{x}{2}\)
- \((g[v], g[l_2])\)加\(\frac{x}{2}\)
- \((g[l_1], g[l_2])\)加\(-\frac{x}{2}\)
其中\(g[u]\)表示的是\(u\)子树下的某个叶子结点。
这样之后我们发现我们将\((g[l_1], g[l_2])\)上的边的边权恢复原状了。
而只改动了\((u, g[v])\)路径上的边,并且\((u, v)\)这条边已经达到要求了。
而\((v, g[v])\)这些边直接更改他们的需求,递归下去做即可。
代码:
#include <bits/stdc++.h>
using namespace std;
#define N 1100
int n, leaf[N], W[N], g[N], root;
int e[N][3];
vector <vector<int>> G;
struct node {
int u, v, w;
node() {}
node(int u, int v, int w) : u(u), v(v), w(w) {}
};
vector <node> res;
bool ok() {
for (int i = 1; i <= n; ++i) {
if (G[i].size() == 2) {
return 0;
}
if (root == -1 || G[i].size() > G[root].size()) {
root = i;
}
}
return 1;
}
int getleaf(int u) {
if (G[u].size() == 0) return u;
for (auto v : G[u]) {
return getleaf(v);
}
}
int fa[N];
void pre(int u) {
for (auto v : G[u]) if (v != fa[u]) {
fa[v] = u;
pre(v);
}
}
void DFS(int u) {
if (G[u].empty()) return;
for (auto v : G[u]) leaf[v] = getleaf(v);
int sze = (int)G[u].size();
if (sze >= 2) {
g[G[u][0]] = leaf[G[u][1]];
}
for (int i = 1; i < sze; ++i) {
g[G[u][i]] = leaf[G[u][i - 1]];
}
for (int sze = (int)G[u].size(), i = 0; i < sze; ++i) {
int v = G[u][i];
int nx, nnx;
if (u == root) {
if (i == 0) {
nx = leaf[G[u][1]], nnx = leaf[G[u][2]];
} else if (i == sze - 1) {
nx = leaf[G[u][i - 1]], nnx = leaf[G[u][i - 2]];
} else {
nx = leaf[G[u][i - 1]], nnx = leaf[G[u][i + 1]];
}
} else {
nx = g[u];
if (i == 0) {
nnx = leaf[G[u][1]];
} else {
nnx = leaf[G[u][i - 1]];
}
}
res.push_back(node(leaf[v], nx, W[v] / 2));
res.push_back(node(leaf[v], nnx, W[v] / 2));
res.push_back(node(nx, nnx, -W[v] / 2));
//cout << v << " " << nx << " " << nnx << endl;
int it = leaf[v];
while (it != v) {
W[it] -= W[v];
it = fa[it];
}
}
for (auto v : G[u]) DFS(v);
}
int main() {
while (scanf("%d", &n) != EOF) {
G.clear(); G.resize(n + 1);
for (int i = 1; i < n; ++i) {
int &u = e[i][0], &v = e[i][1], &w = e[i][2];
scanf("%d%d%d", &u, &v, &w);
G[u].push_back(v);
G[v].push_back(u);
}
root = -1;
if (!ok()) {
puts("NO");
} else {
if (n == 2) {
printf("YES\n1\n");
printf("1 2 %d\n", e[1][2]);
continue;
}
res.clear();
pre(root);
G.clear(); G.resize(n + 1);
for (int i = 1; i < n; ++i) {
if (fa[e[i][0]] == e[i][1]) {
swap(e[i][0], e[i][1]);
}
G[e[i][0]].push_back(e[i][1]);
W[e[i][1]] = e[i][2];
}
DFS(root);
puts("YES");
printf("%d\n", (int)res.size());
assert(res.size() <= 100000);
for (auto it : res) {
printf("%d %d %d\n", it.u, it.v, it.w);
}
}
}
return 0;
}
E. Count Pairs
题意:
给出\(n\)个数\(a_i\),询问有多少对\((i, j)\)满足\((a_i + a_j)(a_i^2 + a_j^2) \equiv k \bmod p\)
思路:
(a_i + a_j)(a_i^2 + a_j^2) &\equiv& k \bmod p \rightarrow \\
(a_i + a_j)(a_i - a_j)(a_i^2 + a_j^2) &\equiv& k(a_i - a_j) \bmod p \rightarrow \\
(a_i^4 - a_j^4) &\equiv& k(a_i - a_j) \bmod p \rightarrow \\
(a_i^4 - ka_i) - (a_j^4 - ka_j) &\equiv& 0 \bmod p \rightarrow \\
a_i^4 - ka_i &\equiv& a_j^4 - ka_j \bmod p
\end{eqnarray*}
\]
然后直接统计即可。
代码:
#include <bits/stdc++.h>
using namespace std;
#define N 300010
#define ll long long
int n; ll p, k, a[N];
map <ll, int> mp;
int main() {
while (scanf("%d%lld%lld", &n, &p, &k) != EOF) {
for (int i = 1; i <= n; ++i) {
scanf("%lld", a + i);
a[i] = (a[i] * a[i] % p * a[i] % p - k + p) % p * a[i] % p;
}
sort(a + 1, a + 1 + n);
mp.clear();
ll res = 0;
for (int i = 1; i <= n; ++i) {
if (mp.find(a[i]) != mp.end()) {
res += mp[a[i]];
}
// if (mp.find(p - a[i]) != mp.end()) {
// res += mp[p - a[i]];
// }
mp[a[i]]++;
}
printf("%lld\n", res);
}
return 0;
}
Codeforces Round #572 (Div. 2)的更多相关文章
- Codeforces Round #572 (Div. 1) 差E
Codeforces Round #572 (Div. 1) A2 题意:给一棵树,带边权,互不相同且为偶数.每次操作是选两个叶子然后在路径上同时加一个数.初始边权全是0,求一个操作序列使得最终边权与 ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- Codeforces Round #279 (Div. 2) ABCDE
Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name A Team Olympiad standard input/outpu ...
- Codeforces Round #262 (Div. 2) 1003
Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...
- Codeforces Round #262 (Div. 2) 1004
Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...
- Codeforces Round #371 (Div. 1)
A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...
随机推荐
- (一)shiro简介和用户登录demo及角色管理
一.shiro简介 Apache Shiro是Java的一个安全框架.Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境.Shiro可以帮助我们完成 ...
- iis7 运行多个https,433端口监听多个htps 站点
默认情况一个服务器的IIS只能绑定一个HTTPS也就是443端口,现在有需要一个服务器 iis 433 端口 绑定多个 申请到证书后(不是必须要通配符的证书),添加多个https站点,先绑定别的端口 ...
- 初试Maven
1 [检查]确认已经安装jdk,已经环境变量中配置JAVA_HOME,已经修改Path 2 [下载]从http://maven.apache.org/download.cgi下载所需要的版本,笔者使用 ...
- mysql5.7解压包安装教程
下载mysql5.7解压包Download MySQL Community Server,解压文件.https://dev.mysql.com/downloads/mysql/ 步骤1:新建my.in ...
- XCode5环境下利用crash log调试线上Crash的流程
1.前言 本文主要介绍在XCode5环境下,如何根据App自己生成的crashlog来调试真机上运行时产生的crash问题. 2. 步骤 (1)构造一段会crash的代码,并放到viewDidLoad ...
- 8.读写锁ReadWriteLock
/*ReadWriteLock 读写锁*/ private ReadWriteLock lock = new ReentrantReadWriteLock(); lock.readLock().loc ...
- Ubuntu 远程管理常用命令
目标 关机/重启 shutdown 查看或配置网卡信息 ifconfig ping 远程登录和复制文件 ssh scp 01. 关机/重启 序号 命令 对应英文 作用 01 shutdown 选项 时 ...
- spring-boot-actuator 常用配置
management: endpoints: web: base-path: "/" exposure: include: "*" endpoint: heal ...
- Ubuntu 手动挂载exfat格式的U盘
1.默认Ubuntu不支持exFat格式的U盘,先要安装支持: sudo apt-get install exfat-fuse 2.挂载磁盘,我选择挂在mnt下面 a.创建挂载目录:sudo mkdi ...
- python获取字符串的前几个字符(包含汉字)
一个简单的字符串,比如a="小明xiaoming"或者b="小xiao明ming".想在只想得到字符串的前4个元素,a1="小明xi",b= ...