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

Codeforces 题解 (不断更新,一起上分) 目录 Educational Codeforces Round 45 (Rated for Div. 2) Educational Codeforces Round 45 (Rated for Div. 2) 题目:A. Commentary Boxes题解 题目:B Micro-World 题解 题目:C Bracket Sequences Concatenation Problem 题解 题目:D Graph And Its Complement 题解 题目:E Po... 阅读详情

Codeforces Round #662 (Div. 2)A-D题解
//写于大号rating值2184/2184,小号rating值1881/1881
//本场拿小号打的,名次在div2选手排78,rating值+219
//A白交了一发假结论,D写错两个变量下标白给两发…
//人永远也不能做到不犯低级错误,只能尽可能避免…

比赛链接:https://codeforces.com/contest/1393
A题
过题用时:5min(罚时1发)
简单结论

具体就不解释了,我的思考方式是从n为奇数开始考虑。
容易得到,当n为奇数的时候,n+2的情况比n的情况多需要1次操作。
而n+1的情况构造次数不可能超过n+2的情况。
由此得到n=1对应答案1,n=2,3对应答案2,n=4,5对应答案3…

#include<bits/stdc++.h>
#define ll long long
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;

int32_t main()
{
    IOS;
    int t;
    cin>>t;
    while(t--)
    {
        ll n;
        cin>>n;
        cout<<(n+2)/2<<endl;
    }
}

B题
过题用时:13min
施行,模型转化

首先题意不要理解错(比如我一开始就读错了)
题意为是我们一开始用n根各种长度的木棒,经过q次增加一根或减少某根长度的木棒,问在每次增减操作后能否用这些木棒构造出一个长方形和正方形,构造的时候只需要用这些木棒构成长方形和正方形的周长部分即可,并且每条边只能放一根木棒

那么先从正方形和长方形的特点总结一下:
正方形需要4根长度相等的木棒
长方形需要2对分别长度相等的木棒

正方形的4根长度相等的木棒其实也可以看成是2对长度相等的木棒,那么实际上我们构造一个构造一个长方形和一个正方形所需要的长度相等的木棒对数就是4,但是同时我们还要满足一个条件,也就是我们存在4根以上同一长度的木棒。

由此我们在增减操作的过程中,维护长度相等的木棒对数,以及木棒根数在4根以上的长度种数,这两个数值即可。

长度的范围是1到1e5,首先进行一次桶排序用num[x]数组记录长度x的木棒有几根,计算初始状态下长度相等的木棒对数cas2,num[x]>=4的x的个数cas4。
之后再根据增减操作对应改变num数组和cas2,cas4的值:
+x操作:
这种情况下长度x的木棒数量是增加的,如果num[x]=3的话,增加后num[x]变为4,cas4的情况+1
如果num[x]是一个奇数的话,增加后可以多构成出一对长度相等的木棒,cas2的情况+1
-x操作:
这种情况下长度x的木棒数量是减少的,如果num[x]=4的话,减少后num[x]变为3,cas4的情况-1
如果num[x]是一个偶数的话,减少后会少构成出一对长度相等的木棒,cas2的情况-1
能构造正方形+长方形的情况为,cas4不为0,且cas2>=4

#include<bits/stdc++.h>
#define ll long long
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
const ll maxn=1e5+7;

ll num[maxn];

int32_t main()
{
    IOS;
    int n;
    cin>>n;
    for(ll i=0;i<n;i++)
    {
        ll x;
        cin>>x;
        num[x]++;
    }
    ll cas2=0,cas4=0;
    for(ll i=1;i<=100000;i++)
    {
        cas2+=num[i]/2;
        if(num[i]>3) cas4++;
    }
    ll q;
    cin>>q;
    while(q--)
    {
        char c;
        ll x;
        cin>>c>>x;
        if(c=='-')
        {
            if(num[x]==4) cas4--;
            if(num[x]%2==0) cas2--;
            num[x]--;
        }
        else
        {
            if(num[x]==3) cas4++;
            if(num[x]%2) cas2++;
            num[x]++;
        }
        if(cas4&&cas2>3) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
}

C题
过题用时:10min
贪心,构造,结论

给你n个数字,现在你需要将这些数字按照一定顺序排列后,使得数值相等的数字之间的间距的最小值最大。

虽然这句“最小值最大”一看就是经典的二分特色…但是实际上这道题直接贪心结论O(n)即可。

以这组数据为例:
14
1 1 1 2 2 2 3 3 3 4 4 6 7 8

我们先通过桶排序找到这些数中出现次数最多为多少次,记为Max,这个样例中Max=3。
出现次数为3的数字分别为1,2,3这三种。

在不考虑其他数字的情况下,我们采用顺序间隔摆放:1,2,3…1,2,3…1,2,3
这样的构造方式使得值相等的数字之间的距离尽可能大,距离值为Max-1=2。

注意到上面的构造中有用省略号“…”表示的空区,这个空区是我们用来摆放剩余数字的。注意到这个空区的个数为Max-1,而剩下的其他数字的出现次数最多也不会等于Max,也就是最多只能和空区的数量相同,等于Max-1,比如对于数字4出现了两次,我们继续平均摆放4到这些空区中就是了。

最终的答案为Max-1再加上每个空区中摆放的数字个数中最小的那个,因此我们要使得这些空区中的数字个数最小的那个值尽可能大,因此我们采用平均摆放的方式。

摆放4后效果为1,2,3,4…1,2,3,4…1,2,3。最终效果为1,2,3, 4,6,8 1,2,3, 4,7, 1,2,3。

记出现次数等于Max的数字个数为cas,那么除了这些数字外的数的个数等于n-Max×\times×cas,空区的个数为Max-1。
不考虑空区的情况下,值相等的数字之间的距离为Max-1,增加空区后,答案增加的值为(n-Max×\times×cas)/(Max-1)。
最终答案就是Max-1+(n-Max×\times×cas)/(Max-1)。

#include<bits/stdc++.h>
#define ll long long
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
const ll maxn=1e5+7;
int32_t main()
{
    IOS;
    int t;
    cin>>t;
    while(t--)
    {
        ll n;
        cin>>n;
        vector<ll>num(n+1,0);
        ll Max=0;
        for(ll i=0;i<n;i++)
        {
            ll x;
            cin>>x;
            num[x]++;
            Max=max(Max,num[x]);
        }
        ll cas=0;
        for(ll i=1;i<=n;i++)
            if(num[i]==Max) cas++;
        cas+=(n-Max*cas)/(Max-1);
        cout<<cas-1<<endl;
    }
}


D题
过题用时:44min(罚时两发,白给巨难受)
dp

首先暴力搜索是必定超时的,自己算下复杂度就知道了。

我的思考方式是这样的:
对于每个位置,我们记录向上最多有几个相邻位置颜色和当前一样,向下最多又有几个相邻位置颜色和当前一样。这两个值当中较小的那个,就是我们当前位置在竖直方向上可以同时向外扩展的最大距离。

我们使用field_d[i][j](这个数据的计算方法就不需要说了吧)来记录位置(i,j)在竖直方向上同时扩展的最大距离,再通过这个数据计算向左和向右可以扩展的最大距离。

field_l[i][j]记录位置(i,j)在向左方向上最多可以伸展的距离
转移方程为field_l[i][j]=min(field_l[i][j-1]+1,field_d[i][j])。
原因在于如果要向左延伸的话,当前位置在竖直方向的延伸距离,不能小于左侧相邻位置在数值方向的延伸距离+1。(观察要求构造的图形可以得到这个结论)

field_r[i][j]记录位置(i,j)在向右方向上最多可以伸展的距离
计算方法同上

向左和向右延伸的距离中取最小,即为当前位置向外延伸的最大距离,累加到答案即可。

#include<bits/stdc++.h>
#define ll long long
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
const ll maxn=2e3+7;

int field_u[maxn][maxn];//field_u[i][j]记录(i,j)位置向上最多有几个相邻位置和(i,j)颜色相同
int field_d[maxn][maxn];//field_u[i][j]记录(i,j)位置向下最多有几个相邻位置和(i,j)颜色相同
//最后field_d[i][j]记录的是(i,j)在竖直方向上最多可以同时延伸多少个位置,颜色都是与(i,j)相同
int field_l[maxn][maxn];
int field_r[maxn][maxn];

string s[maxn];

int32_t main()
{
    IOS;
    int n,m;
    cin>>n>>m;
    ll ans=n*m;//每个格子不向外延伸,自身构成一种答案
    for(ll i=0;i<n;i++) cin>>s[i];
    for(ll j=0;j<m;j++)//计算每个位置,在向上和向下两个方向最多可以延伸多少距离
    {
        for(ll i=1;i<n;i++)
            if(s[i][j]==s[i-1][j]) field_u[i][j]=field_u[i-1][j]+1;
        for(ll i=n-2;i>=0;i--)
            if(s[i][j]==s[i+1][j]) field_d[i][j]=field_d[i+1][j]+1;
    }
    for(ll i=0;i<n;i++)//根据上面的两个数组取最小值,为竖直方向上能同时延伸
        for(ll j=0;j<m;j++)
            field_d[i][j]=min(field_u[i][j],field_d[i][j]);
    for(ll i=0;i<n;i++)//根据竖直方向上能同时延伸的距离值,分别计算向左和向右延伸的最大距离
    {
        for(ll j=1;j<m;j++)
            if(s[i][j]==s[i][j-1]) field_l[i][j]=min(field_l[i][j-1]+1,field_d[i][j]);
        for(ll j=m-2;j>=0;j--)
            if(s[i][j]==s[i][j+1]) field_r[i][j]=min(field_r[i][j+1]+1,field_d[i][j]);
    }
    for(ll i=0;i<n;i++)
        for(ll j=0;j<m;j++)
        ans+=min(field_l[i][j],field_r[i][j]);
    cout<<ans<<endl;
}


《机器学习》周志华_自学记录 第一章绪论## 1.1引言机器学习所研究的主要内容,是关于在计算机上从数据中产生"模型"(model)的算法,即"学习算法"(learning algorithm).在面对新的情况时(例如看到一个没剖开的西瓜),模型会给我们提供相应的判断(例如好瓜).如果说计算机科学是研究关于"算法"的学问,那么类似的,可以说机器学习是研究关于"学习算法"的学问.## 1.2基本术语:用于预测离散值,例如将样本分为“好瓜”或“坏瓜”。:用于预测连续值,例如西瓜的成熟度(如0.95、0.37)。 阅读详情

相关推荐

Windows 64 位系统下安装配置 DOSBox 及 debug.exe

该篇博客同样作为类似问题 “如何在 Windows 64 位系统下进入 debug” 的答案。 很多同学初看王爽的《汇编语言》,或者因为其它原因需要进入 debug 调试模式下学习汇编语言的时候,会发现进入不了,出现类似以下的错误提示。 这是因为他们使用的是 64 位的 Windows 系统(Win 7,Win 8 以及 Win 10 等),而 64 位 Windows 系统不再支持在命令提示符窗口下进入 debug 调试模式。那么对于使用 64 位 Windows 系统的用户来说,该怎样才能够顺利进入 d

加号减减号的博客 5万+

Codeforces Round #662 (Div. 2)

题目:A. Rainbow Dash, Fluttershy and Chess Coloring 轮流染色,相邻的格子不能相同颜色。手写一下4,5可知。 #include<cmath> #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cstdlib> #include<istream> #include<v

weixin_43958964的博客 156

【EtherCAT实践篇一】TwinCAT 3安装、使用

FULL(XAE)安装包:包含了XAR的功能,并能进行多种语言的编程和硬件组态,通常安装在编程电脑上;XAR安装包:包含了ADS的功能,是实时运行环境,对 TwinCAT 模块进行加载、执行、管理、实时运行与调用,通常安装在PLC中;RM安装包:在装了高版本的TwinCAT 3后,发现PLC中的TwinCAT版本较低,就需要安装相应低版本的RM安装包切换版本使用(注:4024无法使用RM安装包切换到低于4022的版本,如4020/4018/4016版本。

JXES智能生态系统 5118

Codeforces Round #662 (Div. 2)题解

A. Rainbow Dash, Fluttershy and Chess Coloring time limit per test 1 second memory limit per test 256 megabytes input

狗蛋的博客 780

NVIDIA Orin AGX开发环境搭建避坑指南:从Ubuntu 22.04到ROS2完整配置流程

本文详细介绍了NVIDIA Orin AGX开发环境搭建的全流程,从Ubuntu 22.04系统安装到ROS2深度优化,涵盖驱动部署、CUDA环境配置、散热与功耗管理等关键步骤。特别针对Orin AGX的特性提供了实用避坑指南和性能优化技巧,帮助开发者高效完成开发环境配置。

weixin_28340315的博客 451

ROBOGUIDE教程:FANUC机器人X型焊枪气动点焊焊接

FANUC机器人X型焊枪气动点焊焊接虚拟仿真实现方法。

IndRobSim 4385

Codeforces Round #662 (Div. 2) A-D --白话题解

#include <iostream> #include <stdio.h> #include<cstring> #include<queue> #include<map> #include<algorithm> #include<cmath> #include<unordered_map> #include<time.h> #define F(i,a,b) for(int i=a;i<=b;i

Cake_C的博客 399

VS Code/TRAE集成Cppcheck并启用MISRA规则

本文探讨了嵌入式开发中Cppcheck工具集成与MISRA规则检查的必要性。详细介绍了安装配置步骤:安装VSCode/TRAE、Cppcheck软件、配置插件参数、安装Python环境,并重点说明了MISRA规则文件的设置方法。通过完整的配置流程,实现了嵌入式开发环境下静态检查与安全标准的落地。

SDFangFang2025的博客 1282

Codeforces Round #662 (Div. 2) 题解.

Codeforces Round #662 (Div. 2) 题解 A. Rainbow Dash, Fluttershy and Chess Coloring 阅读题,题意比较难理解,但是读懂题多画几个例子之后就能发现答案其实就是 ans=n/2+1; #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; int t,n; int main() {

qq_46365538的博客 289

CMOS图像传感器——Remosaic技术

对remosaic技术进行了介绍

沧海一升的博客 9581

华为OD机试真题 新系统 9月27号 【数据中心最佳维护窗口】

华为OD机试真题 新系统【数据中心最佳维护窗口】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【数据中心最佳维护窗口】多语言题解。

qq_45776114的博客 1154

Codeforces Round #662 (Div. 2) D.Rarity and New Dress

题目链接:https://codeforces.com/contest/1393/problem/D 题意: 给你一个n*m的由字母组成的矩阵,,问你这个矩阵中有多少个“相同字母组成的菱形”,菱形规则看图更好理解 比赛的时候一直想着以中心点dp,因为中心点的菱形数量等于它上下左右菱形最大值加1(前提是它上下左右和它本身字符相同)。但是这个状态好像没办法转移,没有办法维护四周的dp值,所以比赛最后还是以失败告终。。。。 早上看到一个大佬的解法,恍然大悟,因为这个图形的特点,我们可以以最下的那个点来进行dp,

HANGANG的博客 459

如何使用 Conda 安装 Qiskit(详细教程)

本文介绍了使用conda安装Qiskit量子计算工具包的完整流程。首先创建Python 3.10的conda虚拟环境(qiskit_env),然后安装Qiskit核心包及可视化组件(注意Mac用户的安装命令差异)。接着注册IPython内核并测试环境,通过量子电路创建与可视化演示验证安装成功。该教程为量子计算开发提供了简洁的环境配置指南,适合研究者和开发者快速搭建Qiskit开发环境。

猿小白的博客 565

D. Rarity and New Dress(思维+动态规划)Codeforces Round #662 (Div. 2)

原题链接:https://codeforces.com/contest/1393/problem/D 题意:给定一个n∗mn*mn∗m的字符矩阵,判断有多少个相同字符斜正方形。 解题思路:我们首先不管别的,对于每一个字符,它都能组成只有一个相同字符的斜正方形。那么其余的就是多种相同字符组合在一起形成的斜正方形了,怎么组合呢?我们不难发现。 仔细看这张图,在第一个图形中,若要构成这样的斜正方形,那么最下面的那个点一定要可以往上延伸。即判断当前位置[i][j]与上面四个位置([i-1][j]、[i-1][j-

pursuit的博客 2522

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

A. Rainbow Dash, Fluttershy and Chess Coloring(思维) Codeforces Round #662 (Div. 2)

原题链接:https://codeforces.com/contest/1393/problem/A 题意:给定一个正方形区域上色,要求上色的块相邻之间不能相同,也就是我们会在每回合上不同的颜色,要求上色的块邻边是边界或是上一个以上色的块。求至少要多少个回合才能把这个正方形区域完。 解题思路:很简单的一道题,首先就是要读懂题目,理解了这题目就真的太水了,我们这样想,在第一个回合,我们只能在边界的块上上色,且 要相邻上色,那么我们至少可以把边界的一半给上完,那么在下个回合,我们用不同的颜色上色自然可以把最外面

pursuit的博客 1516

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Codeforces Round #793 (Div. 2)

Codeforces Round #793 (Div. 2)

AC__dream的博客 437

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Codeforces Round #662 (Div. 2) D. Rarity and New Dress

题目链接:D. Rarity and New Dress 昨天集训队一名同学在做这道题,为了给他增加信心,我说这题很简单,随便做做就过了,然后今天看了这道题,一下午没写出代码。。。emmm,只想在这对那位同学说声抱歉。 题意 给你一个n*m的网格,每个点有一个字母代表一种颜色,题目构造了一种图案——正菱形图案,图案内的颜色必须相同,单个字符也算一个正菱形。 问你在网格中符合条件的图案有多少个? 题解 首先我们来分析这道题,正菱形可以分为上三角形和下三角形,我们以格子的每个点为菱形中心,那么它对答案的贡献值为

张小生的先生的博客 253

这些年打过的比赛codeforces

这些年打过的比赛codeforces Codeforces Round #618 (Div. 2) [codeforces 1300A] Non-zero (0+和)的处理 [codeforces 1300B] Assigning to Classes 排序+取中间两个数 [codeforces 1300C] Anu Has a Function 位运算+打表找规律+最高位开始同位中只有1...

mrcrack的博客 5575

B. Applejack and Storages(数学+STL的使用) Codeforces Round #662 (Div. 2)

原题链接:https://codeforces.com/contest/1393/problem/B 题意:仓库中原有n块给定长度的木板,我想通过这些木板来形成一个正方形,或者一个矩形(正方形也是矩形)。仓库中会进行m个操作,其中对给定长度的木块进行增加或减少(没了自然不用减少)。每进行一次操作判断我是否能达成目的,输出YES or NO。 解题思路:这题一看就是用map容器呀,我认为非常简单,直接对输入数据进行处理即可,每次都遍历一遍map容器判断是否可以达成目的。具体看代码,我这种思路会超时,简直了,求

pursuit的博客 637
上一篇: Codeforces Round #661 (Div. 3)A-E2题解
下一篇: Codeforces Round #663 (Div. 2)A-D题解
StandNotAlone
博客等级 码龄7年 338粉丝 47原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值