Codeforces Round 942 (Div.1) (Div. 2) 2A~2D

2024-05-08 22:36
文章标签 codeforces round div 2d 2a div.1 942

本文主要是介绍Codeforces Round 942 (Div.1) (Div. 2) 2A~2D,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2A.Contest Proposal(枚举)

题意:

一个竞赛包含 n n n个问题,第 i i i个问题的难度预计最多 b i b_i bi。现在已经有 n n n个问题提案,第 i i i个问题的难度为 a i a_i ai。最初, a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,,an b 1 , b 2 , … , b n b_1,b_2,\ldots,b_n b1,b2,,bn都是按非递减顺序排序的。

有些问题可能比预期的更难,因此作者必须提出更多的问题。当提出难度为 w w w的新问题时,最难的问题将从竞赛中删除,问题将以难度不递减的方式排序。

换句话说,在每次操作中,你都要选择一个整数 w w w,将其插入数组 a a a中,对数组 a a a进行非递减排序,并从中删除最后一个元素。

求使对于所有 i i i都有 a i ≤ b i a_i\le b_i aibi的的最小新问题数。

分析:

因为选的 w w w一定可以让它合法,一次操作可以看作 a a a数组向右平移一位。遍历 a a a数组中每个数和第一个比 b b b数组小的差值,取最大值即可。

代码:

#include<bits/stdc++.h>typedef long long LL;
using namespace std;
const LL N = 105;
LL a[N], b[N];int main() {int t;cin >> t;while (t--) {int n, ans = 0, flag = 0;cin >> n;for (int i = 0; i < n; i++) {cin >> a[i];}for (int i = 0; i < n; i++) {cin >> b[i];}for (int i = 0; i < n; i++) {flag = 0;for (int j = i; j < n; j++) {if (a[i] <= b[j]) {ans = max(j - i, ans);flag = 1;j = n;}}if (flag == 0) {ans = max(n - i, ans);}}cout << ans << endl;}return 0;
}

2B.Coin Games(博弈)

题意:

桌子上有 n n n枚硬币围成一个圆圈,每枚硬币要么朝上,要么朝下。爱丽丝和鲍勃轮流玩下面的游戏,爱丽丝先玩。

在每次操作中,玩家选择一枚正面朝上的硬币,取出硬币并翻转与其相邻的两枚硬币。如果(操作前)只剩下两枚硬币,则取出一枚,另一枚不翻转(因为会翻转两次)。如果(操作前)只剩下一枚硬币,则不会翻转任何硬币。如果(操作前)没有正面朝上的硬币,玩家就输了。

如果两人都以最佳方式下棋,谁会赢呢?可以证明,游戏将在有限次的操作中结束,其中一人将获胜。

分析:

U U U视作 1 1 1,将 D D D视作 0 0 0,一次操作就是拿走一个 1 1 1,将两侧分别异或 1 1 1

观察样例,猜测 U U U有奇数个先手赢,反之后手赢。

证明:根据上述转化,判定条件等价于判断全局异或和为 0 0 0还是为 1 1 1。一次操作对全局异或和的影响是将其与 1 1 1进行异或。

初始异或和为 1 1 1时,先手必定可以操作,到后手时异或和为 0 0 0,后手可能可以操作,回到先手,异或和还是 1 1 1,必定可以操作。如此往复,只要后手能操作,先手必定可以操作。

另一种情况类似。

代码:

#include<bits/stdc++.h>using namespace std;void solve() {int n;cin >> n;string s;cin >> s;int cnt = 0;for (int i = 0; i < n; i++)if (s[i] == 'U')++cnt;if (!cnt) {cout << "NO" << endl;return;}if (cnt & 1) {cout << "YES" << endl;} else {cout << "NO" << endl;}
}int main() {int t;cin >> t;while (t--) {solve();}return 0;
}

2C1A.Permutation Counting(贪心)

题意:

你有一些卡片。每张卡片上都写着一个介于 1 1 1 n n n之间的整数:具体来说,从 1 1 1 n n n的每张 i i i,你们有 a i a_i ai张卡片,上面写着数字 i i i

还有一个商店,里面有无限量的各种类型的卡片。你有 k k k枚金币,因此你总共可以购买 k k k张新卡片,你所购买的卡片可以包含 1 1 1 n n n之间的任意整数。

购买新牌后,您要将所有牌重新排列成一行。重新排列的得分是长度为 n n n的(连续)子数组中 [ 1 , 2 , … , n ] [1,2,\ldots,n] [1,2,,n]的排列数。你能得到的最高分是多少?

分析:

贪心地考虑优先用 k k k买原本数量少的卡片,使每种卡片的最少数量尽可能大。

推导一下可以发现使答案尽可能大的结构是 1 , 2 , 3 , 4 , 1 , 2 , 3 , 4 1,2,3,4,1,2,3,4 1,2,3,4,1,2,3,4这样的排列。

计算贡献,假设最小值为 x x x,比 x x x大的有 y y y个,我们一定会把这 y y y个尽量往前放,让较小的 x x x利用充分,这样总共有 ( x − 1 ) n + 1 + y (x−1)n+1+y (x1)n+1+y个合法子段。

然后就是模拟,把 k k k尽量往数量少的分。使用差分维护即可。

代码:

#include<bits/stdc++.h>typedef long long LL;
using namespace std;void solve() {LL n, k;cin >> n >> k;vector<LL> a(n, 0);for (int i = 0; i < n; i++)cin >> a[i];sort(a.begin(), a.end());vector<LL> dlt(n, 0);for (LL i = 0; i < n - 1; i++) {if (!k)break;LL x = (i + 1) * (a[i + 1] - a[i]);if (k >= x) {dlt[i] += a[i + 1] - a[i];k -= x;} else {LL d = k / (LL) (i + 1);for (LL j = 0; j <= i; j++)a[j] += d;k -= (i + 1) * d;for (LL j = i; j >= 0; j--)if (k) {++a[j];--k;}break;}}LL sum = 0;for (LL i = n - 1; i >= 0; i--)sum += dlt[i], a[i] += sum;LL d = k / (LL) n;k -= n * d;for (LL i = n - 1; i >= 0; i--)a[i] += d;for (LL i = n - 1; i >= 0; i--)if (k) {++a[i];--k;}LL res = 0;for (LL i = n - 1; i >= 0; i--)if (a[i] > a[0])++res;cout << a[0] * n - n + 1 + res << endl;
}int main() {int t;cin >> t;while (t--)solve();return 0;
}

2D1(1B1).Reverse Card (Easy Version)(数学)

题意:

给你两个正整数 n n n, m m m

请计算满足以下条件的有序数对 ( a , b ) (a,b) (a,b)的个数:

  • 1 ≤ a ≤ n 1\le a\le n 1an, 1 ≤ b ≤ m 1\le b\le m 1bm;
  • a + b a+b a+b b ⋅ gcd ⁡ ( a , b ) b\cdot\gcd(a,b) bgcd(a,b)的倍数。

分析:

g c d ( a , b ) gcd(a,b) gcd(a,b)一定是等于 b b b,问题转换为 ( a + b ) % ( b ∗ b ) = = 0 (a+b)\%(b*b)==0 (a+b)%(bb)==0

那么 a a a b b b的倍数一定成立,可以通过枚举 b b b来找 a a a

代码:

#include<bits/stdc++.h>using namespace std;void solve() {int n, m;cin >> n >> m;int ans = 0;for (int b = 1; b <= m; ++b) {ans += (n / b + 1) / b - (b == 1);}cout << ans << endl;
}int main() {int t;cin >> t;while (t--)solve();return 0;
}

2D2(1B2).Reverse Card (Hard Version)(数学)

题意:

给你两个正整数 n n n, m m m

请计算满足以下条件的有序数对 ( a , b ) (a,b) (a,b)的个数:

  • 1 ≤ a ≤ n 1\le a\le n 1an, 1 ≤ b ≤ m 1\le b\le m 1bm;
  • b ⋅ gcd ⁡ ( a , b ) b\cdot\gcd(a,b) bgcd(a,b) a + b a+b a+b的倍数。

分析:

gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b)表示为 d d d。假设有 a = p d a=pd a=pd b = q d b=qd b=qd,那么我们知道 gcd ⁡ ( p , q ) = 1 \gcd(p,q)=1 gcd(p,q)=1.

( a + b ) ∣ ( b ⋅ gcd ⁡ ( a , b ) ) ⟺ ( p d + q d ) ∣ ( q d 2 ) ⟺ ( p + q ) ∣ ( q d ) (a+b)\mid(b\cdot\gcd(a,b))\iff(pd+qd)\mid(qd^2)\iff(p+q)\mid (qd) (a+b)(bgcd(a,b))(pd+qd)(qd2)(p+q)(qd)

已知 gcd ⁡ ( p + q , q ) = gcd ⁡ ( p , q ) = 1 \gcd(p+q,q)=\gcd(p,q)=1 gcd(p+q,q)=gcd(p,q)=1,所以是 ( p + q ) ∣ d (p+q)\mid d (p+q)d

我们还知道 p ≥ 1 , q ≥ 1 p\ge 1,q\ge 1 p1,q1,所以 p < d = a p ≤ n p p\lt d=\frac{a}{p}\le\frac{n}{p} p<d=papn,从而 p 2 < n p^2\lt n p2<n。同样,我们可以证明 q 2 < m q^2\lt m q2<m

所以 ( p , q ) (p,q) (p,q)的个数是 O ( n m ) = O ( n + m ) \mathcal O(\sqrt{nm})=\mathcal O(n+m) O(nm )=O(n+m)。我们可以枚举出 gcd ⁡ ( p , q ) = 1 \gcd(p,q)=1 gcd(p,q)=1的每个 ( p , q ) (p,q) (p,q),并计算出答案。需要 ( p + q ) ∣ d (p+q)\mid d (p+q)d,因此我们加上 ⌊ min ⁡ { ⌊ n p ⌋ , ⌊ m q ⌋ } p + q ⌋ \left\lfloor\frac{\min\{\lfloor\frac{n}{p}\rfloor,\lfloor\frac{m}{q}\rfloor\}}{p+q}\right\rfloor p+qmin{⌊pn,qm⌋}

时间复杂度: O ( ∑ n + ∑ m ) \mathcal O(\sum n+\sum m) O(n+m)

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;int main() {int t;cin >> t;while (t--) {ll n, m;cin >> n >> m;ll sq = sqrt(n) + 2, sqm = sqrt(m) + 2;vector bad(sq + 1, vector<bool>(sqm + 1, 0));for (ll i = 2; i <= min(sq, sqm); i++) {for (ll a = i; a <= sq; a += i) {for (ll b = i; b <= sqm; b += i) {bad[a][b] = true;}}}ll ans = 0;for (ll a = 1; a * a <= n; a++) {for (ll b = 1; b * b <= m; b++) {if (bad[a][b]) continue;ans += min(n / (a + b) / a, m / (a + b) / b);}}cout << ans << endl;}return 0;
}

赛后交流

在比赛结束后,会在交流群中给出比赛题解,同学们可以在赛后查看题解进行补题。

群号: 704572101,赛后大家可以一起交流做题思路,分享做题技巧,欢迎大家的加入。

这篇关于Codeforces Round 942 (Div.1) (Div. 2) 2A~2D的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971625

相关文章

Codeforces 158B

很久没有刷题了,刚刚有小学弟问了这道题,AC之后贴上来吧。水~~~ #include <cstdio>#include <cmath>int main() {int n;while(scanf("%d", &n) != EOF) {int a = 0, b = 0, c = 0, d = 0;int arr[100001];for (int i = 0; i < n; ++

Codeforces April Fools Day Contest 2014(附官方题解)

Codeforces2014年愚人节的坑题。。。但还是感觉挺好玩的。。。 A. The Great Game time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Two teams mee

Codeforces April Fools Day Contest 2013

2013年愚人节的坑题。。。 A. Mysterious strings time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Input The input contains a sin

【CSS】深入解释CSS 2D变换

CSS 2D变换(CSS 2D Transformations)是CSS3引入的一组功能,允许你对HTML元素进行2D空间内的移动、旋转、缩放和倾斜等操作。这些变换不会影响到页面的布局,因为它们只是视觉上改变元素的呈现方式,而不是改变其在文档流中的位置或大小。 以下是CSS 2D变换的详细解释: 1. transform 属性 transform 属性用于在2D或3D空间中移动、旋转、缩放或

2D环境感知CenterNet安装

项目地址: https://github.com/xingyizhou/CenterNet 搭建环境并配置CenterNet 这一步主要参考文档INSTALL.md, 但请注意以下几点, 可以避免一些问题。 1.  在文档第1歩中, 若cuda版本是10.0之后的, 使用 conda install pytorch=1.0 torchvision -c pytorch 安装1.0以上的p

力扣SQL50 项目员工 I ROUND AVG

Problem: 1075. 项目员工 I 👨‍🏫 参考题解 Code select project_id,ROUND(AVG(e.experience_years),2) as average_yearsFROMproject as pLEFT JOINemployee as eONp.employee_id = e.employee_idGROUP BYp.proje

【乐吾乐2D可视化组态编辑器】弹框

很多同学问道:如何弹框。Meta2d.js只通知弹框,不直接弹框。 原因很简单,我们不知道用户需要什么样的弹框,弹框通常涉及具体业务数据,只有业务自己知道。 External Player - 哔哩哔哩嵌入式外链播放器 乐吾乐2D可视化组态编辑器地址:https://2d.le5le.com/   1. 定义弹框消息 在图元事件里面,发送一个自定义消息,在Vue/React或Js里面接收

[Codeforces 451B] Sort the Array (实现)

Codeforces - 451B 给定一个序列,其中每个数都不相同 问是否能在翻转其中一段后,整个序列变得单调递增 实现题 首先设一个 B B数组为 AA数组排序后的结果 由于只能翻转一个区间,那么我假装 A是满足要求的 找到最小的 A[l]≠B[l] A[l] \ne B[l],最大的 A[r]≠B[r] A[r] \ne B[r], 翻转的区间将会是 [l,r

[Codeforces 451A] Game With Sticks (博弈)

Codeforces - 451A N根横向木棍,M根纵向木棍组成了一个网格图 每次可以选择一个交点,去掉所有通过这个交点的木棍 两个人交替进行这个游戏,问最后谁能胜利 每次选择的一个交点,必然去掉了一根横向木棍和纵向木棍 所以每次 N和 M都减一 当其中有一个为 0的时候,就是先手必败态 所以只和 N、M中较小的那个的奇偶性有关 #pragma comment(link

[Codeforces 166B] Polygons (点在凸多边形内)

Codeforces - 166B 判断任意多边形 B是否严格在凸多边形 A内部 点在凸多边形内部试板题 如果 B的所有顶点在 A内,则 B在 A内 由于 A的顶点有 105 10^5个,B的顶点有 104 10^4 个 所以不能用 (n) \mathcal{O}(n)的暴力判断 有一个 (logn) \mathcal{O}(logn) 的二分做法 基本原理是用