Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad)【ABCD】
比赛链接:https://codeforces.com/contest/1445
A. Array Rearrangment
题意
给定两个大小均为 \(n\) 的升序数组 \(a\) 和 \(b\) ,判断能否重排数组 \(b\) 使得对任意 \(i\) 均满足 \(a_i + b_i \le x\) 。
题解一
因为 \(a\) 为升序,所以将 \(b\) 按照降序排列判断即可。
代码
#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, x;
cin >> n >> x;
vector<int> a(n);
for (auto &x : a) cin >> x;
vector<int> b(n);
for (auto &x : b) cin >> x;
sort(b.begin(), b.end(), greater<>());
bool ok = true;
for (int i = 0; i < n; i++) if (a[i] + b[i] > x) ok = false;
cout << (ok ? "Yes" : "No") << "\n";
}
return 0;
}
题解二
若 \(a\) 不以升降序给出,则需要对 \(a\) 中的每个数在 \(b\) 中贪心查找最匹配的数。
代码
#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, x;
cin >> n >> x;
vector<int> a(n);
for (auto &x : a) cin >> x;
multiset<int> st;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
st.insert(x);
}
for (const auto &i : a) {
auto it = st.upper_bound(x - i);
if (it != st.begin() and *prev(it) <= x - i) st.erase(prev(it));
}
cout << (st.size() == 0 ? "Yes" : "No") << "\n";
}
return 0;
}
B. Elimination
题意
决赛之前有两场选拔赛,已知:
- 第一场选拔赛第 \(100\) 名的分数为 \(a\) ,第二场选拔赛所有人的分数都不少于 \(b\)
- 第二场选拔赛第 \(100\) 名的分数为 \(c\) ,第一场选拔赛所有人的分数都不少于 \(d\)
计算两场选拔赛的总分至少要多少才能进入决赛。
题解
假如刚好有两百人,那么可以进行以下合理假设:
- 第一场前一百名分数为 \(a\) ,后一百名分数为 \(b\)
- 第二场前一百名分数为 \(c\) ,后一百名分数为 \(d\)
- 第二场的前一百名刚好为第一场的后一百名
- 第二场的后一百名刚好为第一场的前一百名
那么答案即 \(max(a + b,\ c + d)\) 。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int a, b, c, d;
cin >> a >> b >> c >> d;
cout << max(a + b, c + d) << "\n";
}
return 0;
}
C. Division
题意
给定两个数 \(a\) 和 \(b\) ,计算满足以下条件的 \(x\) 的最大值:
- \(x\) 是 \(a\) 的因子
- \(x\) 不是 \(b\) 的倍数
题解
最理想的 \(x\) 是 \(a\) 本身,此时如果 \(x\) 是 \(b\) 的倍数,那么只要将 \(x\) 内的某一质因子降到 \(b\) 中的幂次以下即可。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
long long a, b;
cin >> a >> b;
vector<int> p;
long long n = b;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
p.push_back(i);
while (n % i == 0) n /= i;
}
}
if (n > 1) p.push_back(n);
long long ans = 1;
for (auto i : p) {
long long res = a;
while (res % b == 0) res /= i;
ans = max(ans, res);
}
cout << ans << "\n";
}
return 0;
}
D. Divide and Sum
题意
给定一个大小为 \(2n\) 的数组,考虑将其拆分为两个等长的子序列 \(p\) 和 \(q\) ,并将 \(p\) 以升序排列, \(q\) 以降序排列,同时定义 \(f(p, q) = \sum_{i = 1}^n |p_i - q_i|\) 。
计算所有可能子序列情况下的 \(f(p, q)\) 之和。
题解
不管怎么分,都是大的一半减去小的一半,将和记为 \(sum\) ,答案即 \(C_{2n}^n \times sum\) 。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
constexpr int N = 1e6 + 100;
constexpr int MOD = 998244353;
int fac[N], inv[N];
int binpow(int a, int b) {
int res = 1;
while (b) {
if (b & 1) res = 1LL * res * a % MOD;
a = 1LL * a * a % MOD;
b >>= 1;
}
return res;
}
int C(int n, int m){
if(m < 0 or m > n) return 0;
return 1LL * fac[n] * inv[m] % MOD * inv[n - m] % MOD;
}
void Init(){
fac[0] = 1;
for (int i = 1; i < N; i++) fac[i] = 1LL * fac[i - 1] * i % MOD;
inv[N - 1] = binpow(fac[N - 1], MOD - 2);
for (int i = N - 2; i >= 0; i--) inv[i] = 1LL * inv[i + 1] * (i + 1) % MOD;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
Init();
int n;
cin >> n;
n *= 2;
vector<int> a(n);
for (auto &x : a) cin >> x;
sort(a.begin(), a.end());
int sum = 0;
for (int i = 0; i < n / 2; i++) {
sum += abs(a[i] - a[n - 1 - i]);
sum %= MOD;
}
cout << C(n, n / 2) * sum % MOD << "\n";
return 0;
}
Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad)【ABCD】的更多相关文章
- Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad) D. Divide and Sum (思维,数学,逆元)
题意:有一个长度为\(2n\)数组,从中选分别选\(n\)个元素出来组成两个序列\(p\)和\(q\),(\(p\)和\(q\)中只要有任意一个元素在\(a\)的原位置不同,就算一个新的情况),选完后 ...
- Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad) C. Division (数学)
题意:有两个数\(p\)和\(q\),找到一个最大的数\(x\),使得\(p\ mod\ x=0\)并且\(x\ mod\ q\ne 0\). 题解:首先,如果\(p\ mod\ q\ne0\),那么 ...
- Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics)
A. Even Subset Sum Problem 题意 给出一串数,找到其中的一些数使得他们的和为偶数 题解 水题,找到一个偶数或者两个奇数就好了 代码 #include<iostream& ...
- Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics)部分(A~E)题解
(A) Even Subset Sum Problem 题解:因为n非常非常小,直接暴力枚举所有区间即可. #include<bits/stdc++.h> using namespace ...
- Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals)【A,B,C】
翻车!翻车! codeforces782A A题: 水. 代码: #include <bits/stdc++.h> using namespace std; typedef long lo ...
- Codeforces Round #540 (Div. 3) F1. Tree Cutting (Easy Version) 【DFS】
任意门:http://codeforces.com/contest/1118/problem/F1 F1. Tree Cutting (Easy Version) time limit per tes ...
- Codeforces Round #533 (Div. 2) C. Ayoub and Lost Array 【dp】
传送门:http://codeforces.com/contest/1105/problem/C C. Ayoub and Lost Array time limit per test 1 secon ...
- Codeforces Round #555 (Div. 3) C2. Increasing Subsequence (hard version)【模拟】
一 题面 C2. Increasing Subsequence (hard version) 二 分析 需要思考清楚再写的一个题目,不能一看题目就上手,容易写错. 分以下几种情况: 1 左右两端数都小 ...
- Codeforces Round #561 (Div. 2) A Tale of Two Lands 【二分】
A Tale of Two Lands 题目链接(点击) The legend of the foundation of Vectorland talks of two integers xx and ...
随机推荐
- 通过实例学习 PyTorch
通过范例学习 PyTorch 本博文通过几个独立的例子介绍了 PyTorch 的基础概念. 其核心,PyTorch 提供了两个主要的特征: 一个 n-维张量(n-dimensional Tensor) ...
- docker 镜像导入load、导出save以及重命名
docker 导入导出操作 save 保存(导出)镜像 # 把镜像打包成 .tar # -o 要保存路径.tar # > 要保存路径.tar # docker save 镜像id > /存 ...
- puppetlabs地址
https://yum.puppetlabs.com/el/6Server/products/i386/ rpm -Uvh http://yum.puppetlabs.com/el/6Server/ ...
- Mybatis 一级缓存和二级缓存的使用
目录 Mybatis缓存 一级缓存 二级缓存 缓存原理 Mybatis缓存 官方文档:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#cache My ...
- 设计一款兼容ST207和GD207的开发板
在MCU的学习中,大部分人都是学习别人的开发板,例如正点原子.野火等,优点是有可靠的教程和代码,缺点是容易让人有种自己全部都学会的了错觉,听了课程编写了代码,运行正常. 这个时候,可以尝试自已做一块属 ...
- Redis 实战 —— 05. Redis 其他命令简介
发布与订阅 P52 Redis 实现了发布与订阅(publish/subscribe)模式,又称 pub/sub 模式(与设计模式中的观察者模式类似).订阅者负责订阅频道,发送者负责向频道发送二进制字 ...
- 在EXCEL中如何同时冻结行与列?
鼠标所在的单元格的位置 ,决定了你冻结的行和列.如: 冻结第一行与第一列, 只需要将鼠标置于单元格在第二列,第二行. 点击冻结
- 利用JavaUDPSocket+多线程模拟实现一个简单的聊天室程序
对Socket的一点个人理解:Socket原意是指插座.家家户户都有五花八门的家用电器,但它们共用统一制式的插座.这样做的好处就是将所有家用电器的通电方式统一化,不需要大费周章地在墙壁上凿洞并专门接电 ...
- C#高级编程第11版 - 第五章 索引
[1]5.1 泛型概述 1.通过泛型,你可以创建独立于特定类型(contained types)以外的方法和类,而不用为不同类型编写多份同样功能的代码,你只需要创建一个方法或者类. 2.泛型类使用泛型 ...
- Qt 自动化测试Test cutedriver
示例 https://github.com/nomovok-opensource/cutedriver-examples CuteDriver examples This repository con ...