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;
}


【KITTI数据集中Raw_Data数据标定文件中的参数关系解读】 上一节本人将KITTI Odometry数据集中的参数文件进行了解释。本节主要针对一些做融合slam的人,将Raw_Data数据标定文件中的参数按照自己的理解做如下阐述。其中,所讲之处如有错误,欢迎各位批评指正。 阅读详情

相关推荐

[仿真实战]FDTD Solutions 8.0:从零搭建薄膜光谱分析模型

本文提供了一份基于FDTD Solutions 8.0的薄膜光谱分析模型从零搭建实战指南。通过详细步骤,手把手教你创建玻璃基底与硅薄膜的几何结构、设置仿真区域与边界条件、配置光源与监视器,并最终计算反射率与透射率光谱。内容涵盖参数扫描与优化,旨在帮助用户快速掌握FDTD仿真在纳米光子学与薄膜光学设计中的核心应用。

defi6farmer的博客 499

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

顶会新宠!Gate+Attention创新思路发A会

性能提升:在Places2自然场景和CelebA-HQ人脸数据集上,与以往方法相比,该系统在自由形式掩码修复任务中取得了更高的质量和更低的误差(例如,平均ℓ1误差和ℓ2误差显著降低)。硬件效率提升:Griffin和Hawk在TPU-v3上的训练效率与Transformer相当,且在推理时具有更低的延迟和显著更高的吞吐量。门控卷积:提出了一种新的门控卷积机制,通过学习每个通道在每个空间位置的动态特征选择机制,解决了传统卷积将所有输入像素视为有效像素的问题。

2501_92785035的博客 974

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

泛微OA与金蝶云星空深度集成实战:审批与表单双场景解析

本文深入解析泛微OA与金蝶云星空的深度集成实战,聚焦审批流程与表单对接两大核心场景。通过具体案例,详细阐述了如何实现业务数据与审批流程的自动联动,打破数据孤岛,提升企业运营效率与数据一致性,并分享了接口设计、安全策略及实战避坑指南。

4k5l6j7h8的博客 466

FinRL实战:5步搞定股票量化交易策略(附Python代码)

本文详细介绍了如何使用FinRL框架,通过5个步骤构建基于深度强化学习的股票量化交易策略。内容涵盖从环境搭建、数据获取与预处理,到交易环境构建、模型训练(如PPO算法),以及策略回测评估与优化的完整流程,并提供了可运行的Python代码示例,帮助读者快速入门AI驱动的量化交易。

weixin_29062865的博客 626

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

PADS VX2.7学习记录06-PADS Router软件功能操作

PADS VX2.7学习记录06-PADS Router软件功能操作

qq_31444421的博客 7860

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

西门子触摸屏教程wincc flexible2008 sp5 Smart V3 V4中文版软件

西门子触摸屏教程wincc flexible2008 sp5 Smart V3 V4中文版软件

liang007dudu的博客 1万+

电压跟随器在ADC采样电路中的作用分析

电压跟随器在ADC采集系统中扮演关键角色,它能解决分压电路因ADC输入阻抗导致的电压误差问题。通过运放构成的电压跟随器可隔离信号源与负载,保证采样精度,尤其适用于高阻抗传感器或高速采样场景。工程应用中需注意运放带宽、轨对轨输出能力及抗干扰设计。合理使用电压跟随器能显著提升信号完整性,在复杂电子系统中成为不可或缺的"信号桥梁。

硬核科技 655

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

OpenCV-Python实战(10)——详解 OpenCV 轮廓检测

在计算机视觉领域,轮廓通常指图像中对象边界的一系列点。因此,轮廓通常描述了对象边界的关键信息,包含了有关对象形状的主要信息,该信息可用于形状分析与对象检测和识别。在本文中,将首次通过简单示例了解轮廓的基本概念,然后通过实际示例来了解如何检测和压缩轮廓,最后利用介绍如何利用图像矩描述检测到的轮廓属性。

盼小辉丶的博客 3万+

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

pursuit的博客 1516

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

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

Codeforces Round #793 (Div. 2)

Codeforces Round #793 (Div. 2)

AC__dream的博客 437

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、付费专栏及课程。

余额充值