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

  1. Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad) D. Divide and Sum (思维,数学,逆元)

    题意:有一个长度为\(2n\)数组,从中选分别选\(n\)个元素出来组成两个序列\(p\)和\(q\),(\(p\)和\(q\)中只要有任意一个元素在\(a\)的原位置不同,就算一个新的情况),选完后 ...

  2. 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\),那么 ...

  3. Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics)

    A. Even Subset Sum Problem 题意 给出一串数,找到其中的一些数使得他们的和为偶数 题解 水题,找到一个偶数或者两个奇数就好了 代码 #include<iostream& ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. Codeforces Round #555 (Div. 3) C2. Increasing Subsequence (hard version)【模拟】

    一 题面 C2. Increasing Subsequence (hard version) 二 分析 需要思考清楚再写的一个题目,不能一看题目就上手,容易写错. 分以下几种情况: 1 左右两端数都小 ...

  9. 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 ...

随机推荐

  1. chatsRoom Design Report

    基于TCP实现聊天室 主要使用四个类 ChatClient类     使用BufferedReader 得到输入流,使用OutputStream得到输出流     实现读取服务器广播的消息和发送消息到 ...

  2. MySQL 集群知识点整理

    随着项目架构的不断扩大,单台 MySQL 已经不能满足需要了,所以需要搭建集群将前来的请求进行分流处理.博客主要根据丁奇老师的专栏<<MySQL实战45讲>>学习的总结. 架构 ...

  3. Redis 设计与实现 10:五大数据类型之有序集合

    有序集合 sorted set (下面我们叫zset 吧) 有两种编码方式:压缩列表 ziplist 和跳表 skiplist. 编码一:ziplist zset 在 ziplist 中,成员(mem ...

  4. 用js实现打印九九乘法表

    用js在打印九九乘法表 思考 在学习了流程控制和条件判断后,我们可以利用js打印各式各样的九九乘法表 不管是打印什么样三角形九九乘法表,我们都应该找到有规律的地方,比如第一列的数字是什么规律,第一行的 ...

  5. 【JS学习】String基础方法

    前言:本博客系列为学习后盾人js教程过程中的记录与产出,如果对你有帮助,欢迎关注,点赞,分享.不足之处也欢迎指正,作者会积极思考与改正. 目录 定义: 字符串的连接: 标签模板的使用: 字符串的基本方 ...

  6. Python运维自动化psutil 模块详解(超级详细)

    psutil 模块 参考官方文档:https://pypi.org/project/psutil/ 一.psutil简介 psutil是一个开源且跨平台(http://code.google.com/ ...

  7. oracle关闭监听log.xml文件生成步骤

    1.查看sqlnet.ora文件是否存在 cd $ORACLE_HOME/network/admin ls 如果不存在,copy一个过来 cp samples/sqlnet.ora . 2.修改sql ...

  8. SAP GUI用颜色区分不同的系统

    对于经常打开多个窗口的SAP用户,有时候可能同时登录了生产机.测试机和开发机,为了避免误操作,比如在测试要执行的操作,结果在生产机做了,结果可想而知. 虽然可以通过右下角查看再去判断,但是总是没有通过 ...

  9. 集成多种协议、用于 USB-A 和 TYPE-C 双端口输出的快充协议芯片IP2726

    1. 特性  支持 1A1C  支持 USB-A 和 TYPE-C 双端口输出  单口输出支持全部快充协议  双口同时插入时降压到 5V  快充规格  集成 QC2.0/QC3.0/QC4/QC4+输 ...

  10. CentOS 7.4通过rpm包离线安装 Mysql8.0并部署主从复制(附从库备份脚本)

    一. 部署MySQL (两个节点都做) 下载 rpm包 wget https://goodrain-pkg.oss-cn-shanghai.aliyuncs.com/mysql8.rpm tar xv ...