Codeforces Round 924 (Div. 2)题解(A-D)

image-20240218202656564

A - Rectangle Cutting

链接:A - Rectangle Cutting

思路

考虑横边和纵边,若为偶数,则从中间分开,重新组合为一个长方形,检测是否与原来的长方形一致。

代码

#include <bits/stdc++.h>
using namespace std;inline bool test(int x, int y, int a, int b){if(x == a && y == b) return false;else if(x == b && y == a) return false;return true;
}inline bool solve(int x, int y){if(x & 1) return false;return test(x, y, x / 2, y * 2);
}
int main()
{int T;cin >> T;while(T--){int a, b;scanf("%d%d", &a, &b);if(solve(a, b) || solve(b, a)){puts("YES");}else{puts("NO");}}return 0;
}

B - Equalize

链接:B - Equalize

思路

我们发现原本相同的元素在经过操作之后必定会变得不相同,即最终相同的元素在操作之前并不相同,所以我们可以执行去重操作。

由于分配全排列类似于阶梯,所以其可以把值为 [ k , k + n ) [k, k + n) [k,k+n) 范围内的元素进行操作,使得最终值相同。

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 20;
int n;
int a[N];
int main()
{int T;cin >> T;while(T--){scanf("%d", &n);for(int i = 1; i <= n; i++) scanf("%d", a + i);sort(a + 1, a + 1 + n);int len = unique(a + 1, a + 1 + n) - (a + 1);int l = 1;int ans = 1;for(int r = 1; r <= len; r ++){while(a[r] - a[l] >= n){l ++;}ans = max(ans, r - l + 1);}printf("%d\n", ans);}return 0;
}

C - Physical Education Lesson

链接:C - Physical Education Lesson

题意

总共有 n n n 个人,有个参数 k k k ,从前往后依次给这些人分配序号,序号的分配规则如下:

  • k 个人的号码是 1 , 2 , 3 , … , k 1,2,3,…,k 1,2,3,,k
  • 接下来 k − 2 k-2 k2 个人的号码为 k − 1 , k − 2 , … , 2 k−1, k−2, …, 2 k1,k2,,2
  • 然后以 2 k − 2 2k - 2 2k2 为周期,依次给剩下位置的人分配指标

现在知道一个人的位置和这个人所得到的指标,k 的可能取值范围有多少个?

思路

分为一下两种情况:

由于周期为 2 k − 2 2k - 2 2k2 ,所以统统把位置通过取模运算转化到前 2 k − 2 2k - 2 2k2 个等价的位置。

①这个人得到的指标位于正序的情况中(1,2,3,…,k)【void yinsu1(int x)】

转化位置:
( n − 1 ) % ( 2 k − 2 ) + 1 = x (n - 1)\%(2k-2)+1=x (n1)%(2k2)+1=x
即:
( n − 1 ) % ( 2 k − 2 ) = x − 1 (n - 1)\%(2k-2)=x-1 (n1)%(2k2)=x1
x ≤ k x \le k xk ,则有得 x − 1 < 2 k − 2 x-1 < 2k-2 x1<2k2 ,所以有同余关系:
n − 1 = x − 1 m o d ( 2 k − 2 ) n − x = 0 m o d ( 2 k − 2 ) n - 1=x-1\mod (2k-2) \\ n - x= 0 \mod (2k-2) \\ n1=x1mod(2k2)nx=0mod(2k2)
( n − x ) (n-x) (nx) 可以整除 2 ( k − 1 ) 2(k - 1) 2(k1) 的时候,那么就成立。

所以应该求 ( n − x ) 2 \frac{(n-x)}{2} 2(nx)的所有因数,k即为 因数 + 1 因数+1 因数+1

时间复杂度为 O ( n ) O(\sqrt{n}) O(n )

②这个人得到的指标位于倒序的情况中(k−1, k−2, …, 2)【void yinsu2】

在这种情况下, x x x 自然就不可能为 k k k 或者是 1 1 1

与上面类似,可以得出等式:
( n − 1 ) % ( 2 k − 2 ) + 1 = 2 k − x (n - 1)\% (2k-2)+1=2k -x (n1)%(2k2)+1=2kx
即:
( n − 1 ) % ( 2 k − 2 ) = 2 k − x − 1 (n - 1)\% (2k-2)=2k -x-1 (n1)%(2k2)=2kx1
由于 x 不可能为 1,且为自然数,那么有 2 k − 2 < 2 k − 1 − x 2k-2 < 2k-1-x 2k2<2k1x

故有:
n − 1 = 2 k − x − 1 m o d ( 2 k − 2 ) n + x − 2 k = 0 m o d 2 ( k − 1 ) n - 1=2k -x-1 \mod (2k-2) \\ n +x-2k=0 \mod 2(k-1) \\ n1=2kx1mod(2k2)n+x2k=0mod2(k1)
所以需要求使得 n + x − 2 k n+x-2k n+x2k 可以被 2 ( k − 1 ) 2(k - 1) 2(k1) 整除的 k 的个数

设做除法之后的商为 t,则有:
n + x − 2 k 2 ( k − 1 ) = t n + x 2 − k ( k − 1 ) = t n + x 2 − k = k t − t k ( 1 + t ) = n + x 2 + t k = n + x 2 + t 1 + t k = n + x 2 − 1 + ( t + 1 ) t + 1 \frac{n+x-2k}{2(k-1)}=t\\ \frac{\frac{n+x}{2}-k}{(k-1)}=t\\ \frac{n+x}{2}-k=kt-t\\ k(1+t)=\frac{n+x}{2}+t\\ k = \frac{\frac{n+x}{2}+t}{1+t}\\ k = \frac{\frac{n+x}{2}-1+(t+1)}{t+1}\\ 2(k1)n+x2k=t(k1)2n+xk=t2n+xk=kttk(1+t)=2n+x+tk=1+t2n+x+tk=t+12n+x1+(t+1)
此时,仅仅需要找 n + x 2 − 1 \frac{n+x}{2}-1 2n+x1 的因数,然后有:
k = n + x 2 − 1 因数 + 1 k=\frac{ \frac{n+x}{2}-1 }{因数}+1 k=因数2n+x1+1
由于有 x ≤ k x \le k xk,并且 k 可能会重复,所以进行去重,并且仅仅考虑大于等于 x 的 k

代码

#include <bits/stdc++.h>
using namespace std;
vector<int> ans;
int n, x;
void yinsu1(int x){// 考虑了1这一个因数, 正常求得所有的因数,然后放在数组中for(int i = 1; (long long)i * i <= (long long)x; i++){if(x % i == 0){if((long long)i * i == (long long)x) ans.push_back(i + 1);else {ans.push_back(i + 1);ans.push_back(x / i + 1);}}}return;
}void yinsu2(int x){for(int i = 1; (long long)i * i <= (long long)x; i++){if(x % i == 0){if((long long)i * i == (long long)x) ans.push_back(x / i + 1);else {ans.push_back(x / i + 1);int tmp = (x / i);ans.push_back(x / tmp + 1);}}}
}
int main()
{int T;cin >> T;while(T--){ans.clear();scanf("%d%d", &n, &x);if(x > n) {// 不可能puts("0");continue;}// 计算在正序范围内的if(!((n - x) & 1))yinsu1(abs(n - x) / 2);if(x != 1 && x != n && !((n + x) & 1))// 倒序中不含1和nyinsu2(abs(n + x) / 2 - 1);sort(ans.begin(), ans.end());ans.erase(unique(ans.begin(), ans.end()), ans.end());int cnt = 0;for(int _ : ans){if(_ >= max(2, x)) cnt++;}printf("%d\n", cnt);}return 0;
}

D - Lonely Mountain Dungeons

链接:D - Lonely Mountain Dungeons

题意

有n个不同的种群,每一个种群中的生物数量为c[i].

假设现在有 t 个分队,那么计算总兵力的方法如下:

  1. 针对每一种种群,当有一对生物处于两个小队,那么战斗力会增加 b
  2. 减去 x ( t − 1 ) x(t-1) x(t1)

思路

最重要的是有一个温馨提示:

保证所有测试用例的数值 c 1 + c 2 + … + c n c_1 + c_2 + \ldots + c_n c1+c2++cn 之和不超过 2 ⋅ 1 0 5 2 \cdot 10^5 2105

这样使得我们可以进行暴力。

①单独对于某一种群,查看如何分配,才可以使得这一种种群的战斗力最大

我们可以采用移动法:

把某一小队的一个生物移动到其他分队,查看其总贡献的变化。

经过推敲,我们容易知道,当把一个生物从A队移动到B队,当且仅当A队的生物的数量个数(不包含移动的那一个)多余B队生物数量(不包含移动的那一个)时,才会更加有意义。

所以合理的排布为:

  1. 先给每一小队分配 ⌊ c [ i ] t ⌋ \lfloor \frac{c[i]}{t} \rfloor tc[i]
  2. 然后把剩余的给每一小队分一个,直到分完。

②如何计算某一种群按照①的方法分配之后的贡献值

根据数学知识,知道:
C k − c m o d k 2 ⋅ y 2 + C c m o d k 2 ⋅ y ′ 2 + ( k − c m o d k ) ⋅ ( c m o d k ) ⋅ y ⋅ y ′ C_{k - c \bmod k}^2 \cdot y^2 + C_{c \bmod k}^2 \cdot y'^2 + (k - c \bmod k) \cdot (c \bmod k) \cdot y \cdot y' Ckcmodk2y2+Ccmodk2y′2+(kcmodk)(cmodk)yy
其中 y = ⌊ c k ⌋ y = \left\lfloor \frac{c}{k} \right\rfloor y=kc y ′ = ⌈ c k ⌉ y' = \left\lceil \frac{c}{k} \right\rceil y=kc.

③时间复杂度问题

当 $t > c[i] $ 的时候,我们发现这个种群的贡献最多为 t = = c [ i ] t==c[i] t==c[i] 时候的情况,这个时候,我们就没有必要计算 $t > c[i] $ 的时候这个种群的贡献,仅仅需要通过add数组记录即可。

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, b, x;
const int N = 2e5 + 20;
int a[N];int cnt[N];
int add[N];
int getPair(int n, int k){int x = n / k;int y = n % k;return    (x+1) * (x+1) * (y*(y-1))/2+ x * x * (k-y)*(k-y-1)/2+ (x+1) * x * (y) * (k - y);
}
void solve(){for(int i = 1; i <= n; i++){for(int j = 1; j <= a[i]; j++){cnt[j] += getPair(a[i], j);}add[a[i]] += getPair(a[i], a[i]);}
}void init(int maxv){for(int i = 1; i <= maxv + 1; i++){add[i] = 0;cnt[i] = 0;}
}
signed main()
{int T;cin >> T;while(T--){scanf("%lld%lld%lld", &n, &b, &x);for(int i = 1; i <= n; i++) scanf("%lld", a + i);int maxv = 0;for(int i = 1; i <= n; i++){maxv = max(maxv, a[i]);}init(maxv);solve();int ans = 0;int other = 0;for(int i = 1; i <= maxv; i++){ans = max(ans, (cnt[i] + other) * b - (i - 1) * x);other += add[i];}printf("%lld\n", ans);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/690236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探秘OpenAI的神奇之作:Sora技术揭秘

探秘OpenAI的神奇之作&#xff1a;Sora技术揭秘 1. 引言 在当今科技快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;正日益成为各个领域的关键技术。而在人工智能领域中&#xff0c;OpenAI公司一直以来都扮演着重要的角色。他们的最新创新——Sora技术&#x…

基于python的遥感影像灰色关联矩阵纹理特征计算

遥感影像纹理特征是描述影像中像素间空间关系的统计特征&#xff0c;常用于地物分类、目标识别和变化检测等遥感应用中。常见的纹理特征计算方式包括灰度共生矩阵&#xff08;GLCM&#xff09;、灰度差异矩阵&#xff08;GLDM&#xff09;、灰度不均匀性矩阵&#xff08;GLRLM&…

常见面试题:TCP的四次挥手和TCP的滑动窗口

说一说 TCP 的四次挥手。 挥手即终止 TCP 连接&#xff0c;所谓的四次挥手就是指断开一个 TCP 连接时。需要客户端和服务端总共发出四个包&#xff0c;已确认连接的断开在 socket 编程中&#xff0c;这一过程由客户端或服务端任意一方执行 close 来触发。这里我们假设由客户端…

unity学习(29)——GameInfo角色信息

1.把GameInfo.cs PlayerModel.cs Vector3.cs Vector4.cs PlayerStateConstans.cs GameState.cs依次粘到model文件夹中&#xff0c;此时项目没有错误&#xff0c;如下图所示&#xff1b; 对应处所修改的代码如下&#xff1a; case LoginProtocol.LOGIN_SRES://1 {Debug.Log(&qu…

考研查分,别再只知道研招网了!

查分时间基本已经敲定在2月26日左右了。倒计时7天&#xff01;每年查询分数的时候经常因为查询人数太多&#xff0c;进不去研招网&#xff0c;还有哪些方法可以查询分数呢&#xff1f; 我为大家整理了四种常用的查成绩方式&#xff0c;附带部分已公布查分时间院校名单。 一、…

Java学习心得感悟

在我踏入Java学习的道路之前&#xff0c;我对编程只是一知半解&#xff0c;对于代码的世界充满了好奇和向往。然而&#xff0c;当我真正开始学习Java时&#xff0c;我才意识到&#xff0c;学习Java不仅仅是学习一门编程语言&#xff0c;更是一种思维方式和解决问题的能力的培养…

【AI视野·今日Sound 声学论文速览 第四十九期】Wed, 17 Jan 2024

AI视野今日CS.Sound 声学论文速览 Wed, 17 Jan 2024 Totally 23 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers From Coarse to Fine: Efficient Training for Audio Spectrogram Transformers Authors Jiu Feng, Mehmet Hamza Erol, Joon Son Chung,…

Pandas Series Mastery: 从基础到高级应用的完整指南【第83篇—Series Mastery】

Pandas Series Mastery: 从基础到高级应用的完整指南 Pandas是Python中一流的数据处理库&#xff0c;它为数据科学家和分析师提供了强大的工具&#xff0c;简化了数据清理、分析和可视化的流程。在Pandas中&#xff0c;Series对象是最基本的数据结构之一&#xff0c;它为我们处…

Spring Security基础学习

一、SpringSecurity框架简介 二、SpringSecurity入门案例 三、SpringSecurity Web权限方案 四、SpringSecurity微服务权限方案 五、SpringSecurity原理总结

Unity中的Lerp插值的使用

Unity中的Lerp插值使用 前言Lerp是什么如何使用Lerp 前言 平时在做项目中插值的使用避免不了&#xff0c;之前一直在插值中使用存在误区&#xff0c;在这里浅浅记录一下。之前看的博客或者教程还多都存在一个“永远到达不了&#xff0c;只能无限接近”的一个概念。可能是之前脑…

open3d DBSCAN 聚类

DBSCAN 聚类 一、算法原理1.密度聚类2、主要函数 二、代码三、结果四、相关数据 一、算法原理 1.密度聚类 介绍 基于密度的噪声应用空间聚类(DBSCAN)&#xff1a;是一种无监督的ML聚类算法。无监督的意思是它不使用预先标记的目标来聚类数据点。聚类是指试图将相似的数据点分…

微信美容预约小程序开发实战教程,快速掌握开发技巧

如果你想开发一个美容美发小程序&#xff0c;以下是一个搭建指南&#xff0c;供你参考。 1. 使用第三方制作平台 首先&#xff0c;你需要使用一个第三方制作平台&#xff0c;如乔拓云网。在该平台上&#xff0c;你需要注册并登录&#xff0c;然后点击【轻应用小程序】进入设计…

springboot201基于SpringBoot的论坛系统设计与实现

论坛系统设计与实现 摘 要 如今的时代&#xff0c;是有史以来最好的时代&#xff0c;随着计算机的发展到现在的移动终端的发展&#xff0c;国内目前信息技术已经在世界上遥遥领先&#xff0c;让人们感觉到处于信息大爆炸的社会。信息时代的信息处理肯定不能用之前的手工处理这…

LineageOS:Android开源手机操作系统的未来之路

LineageOS&#xff1a;开源手机操作系统的未来之路 1. 引言 当前移动技术的迅猛发展使得手机操作系统变得至关重要。在众多操作系统中&#xff0c;LineageOS作为一款备受推崇的开源手机操作系统&#xff0c;其在过去几年中取得了显著的发展。本文将介绍LineageOS作为一款开源…

2009-2023年上市公司华证ESG评级得分数据

2009-2023年上市公司华证ESG评级得分数据 1、时间&#xff1a;2009-2023年 2、来源&#xff1a;华证ESG评级 3、范围&#xff1a;A股上市公司 4、指标&#xff1a;股票代码、证券简称、年份、ESG得分-年均值、ESG得分-年中位数 5、方法说明&#xff1a;将华证ESG评级进行赋…

力扣题目训练(16)

2024年2月9日力扣题目训练 2024年2月9日力扣题目训练530. 二叉搜索树的最小绝对差541. 反转字符串 II543. 二叉树的直径238. 除自身以外数组的乘积240. 搜索二维矩阵 II124. 二叉树中的最大路径和 2024年2月9日力扣题目训练 2024年2月9日第十六天编程训练&#xff0c;今天主要…

Nginx学习笔记

Bilibili尚硅谷视频 Nginx 简介 Nginx 概述 Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数 。 正向代理 正向代理&#xff1a;如…

【千帆平台】使用千帆大模型平台创建自定义模型调用API,贺岁灵感模型,文本对话

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和…

镜像管理工具harbor启动在docker中,应该如何重启?

Harbor 是一个用于存储和分发 Docker 镜像的企业级Registry服务器。在 Docker 环境中启动和管理 Harbor 时&#xff0c;您可能需要重启服务来应用更新或配置更改。以下是在 Docker 中重启 Harbor 的步骤&#xff1a; 登录到服务器&#xff1a;首先&#xff0c;您需要通过 SSH 或…

神秘物品,从此告别网络焦虑!随身WiFi好用吗?随身WiFi怎么选?

出门在外&#xff0c;网络可是我们的“生命线”。不拿钱包不拿身份证没啥&#xff0c;不拿手机&#xff0c;没有网可是大大的坏事儿。为了一劳永逸的解决我的网络问题&#xff0c;这次我尝试了一款随身WiFi&#xff0c;来简单聊聊我的真实体验感受吧&#xff01; 一、优点&…