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

X光安检模型训练第一步:手把手教你处理OPIXray和HIXray这两个小众数据集 本文详细解析了X光安检AI模型训练的关键步骤,重点介绍如何处理OPIXray和HIXray这两个专业数据集。从数据格式转换到YOLO标准,再到数据增强和质量验证,手把手指导开发者高效利用这些数据集进行目标检测模型训练,提升安检场景下的危险物品识别准确率。 阅读详情

Codeforces Round #670 (Div. 2)A-D题解
//写于rating值1987/2184
//补档

比赛链接:https://codeforces.ml/contest/1406

A题
贪心,施行

题意为给你一堆自然数,让你把他们分成两个部分。两个部分当中的各自没出现的最小的自然数相加,要求这个结果最大,询问这个最大结果是多少。

直接贪心依次取两个部分的数就可以了。
从0开始连续+1最多可以取到x,那么这个部分没出现的最小自然数就是x+1了,也是我们使用当前剩下的数字能得到的最大值。

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

int num[107];//记录每个数字出现了几次

int32_t main()
{
    IOS;
    int t;
    cin>>t;
    while(t--)
    {
        memset(num,0,sizeof(num));
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            int x;
            cin>>x;
            num[x]++;
        }
        int ans=0;
        for(int j=0;j<2;j++)//执行两次,分为两个部分
        {
            for(int i=0;1;i++)
            {
                if(i==101) {ans+=101;break;}//循环到101就可以结束了,输入数据最大也只有100
                if(num[i]==0) {ans+=i;break;}//当前数字不存在,则就为当前部分的最小未出现自然数,累加到答案并结束循环
                else num[i]--;//代表使用一个数字到当前部分里
            }
        }
        cout<<ans<<endl;
    }
}

B题
贪心,分类讨论,简单整体思维

题意为给定一个数列,你可以从中任意挑选5个数字乘起来(题意理解成这样就很简单了),希望你求出最大的结果。

这里任意挑选5个数字么,根据最后结果是正还是负(0可以包含在任意一种情况里),我们对最后结果的绝对值倾向是不同的。
如果结果为正,那么我们希望绝对值尽可能大。
如果结果为负,那么我们希望绝对值尽可能小。

而挑选5个数字,我们可以按照其中负数出现的次数,来决定最后结果的正负性。
由此我们可以把负数出现0,2,4次,和出现1,3,5次分为两种情况分别讨论,取各自情况的最大值即可。

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

vector<ll>zhengshu,fushu;

int32_t main()
{
    IOS;
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            ll x;
            cin>>x;
            if(x<0) fushu.push_back(x);
            else zhengshu.push_back(x);
        }
        sort(fushu.begin(),fushu.end());
        sort(zhengshu.begin(),zhengshu.end());
        ll ans=-llINF;
        for(ll i=1;i<=5;i+=2)//正数或者0的出现次数为奇数,负数的出现次数为偶数
        {
            ll j=5-i;//i为正数出现次数,j为负数出现次数
            if(zhengshu.size()>=i&&fushu.size()>=j)//此时结果为正数,我们要使得绝对值尽可能大,这样值更大
            {
                ll temp=1;
                for(ll k=1;k<=i;k++) temp*=zhengshu[zhengshu.size()-k];//正数绝对值大的在末尾
                for(ll k=0;k<j;k++) temp*=fushu[k];//负数绝对值大的在开头
                ans=max(ans,temp);
            }
        }
        for(ll i=0;i<5;i+=2)//正数或者0的出现次数为偶数,负数的出现次数为奇数
        {
            ll j=5-i;
            if(zhengshu.size()>=i&&fushu.size()>=j)//此时结果为负数,我们要使得绝对值尽可能小,这样值更大
            {
                ll temp=1;
                for(ll k=0;k<i;k++) temp*=zhengshu[k];//正数绝对值小的在开头
                for(ll k=1;k<=j;k++) temp*=fushu[fushu.size()-k];//负数绝对值小的在末尾
                ans=max(ans,temp);
            }
        }
        zhengshu.clear();
        fushu.clear();
        cout<<ans<<endl;
    }
}

C题
树,构造,图结论

题意为,给你一棵n个节点的树,现在从这棵树中取走一个节点,要使得剩下的图中,拥有最大节点数量的树的节点数要尽可能小。
现在不希望这个取走的节点有多种取法,你可以去除掉原树中的一条边,再重连一条边,够成一课新树,使得那个取走的节点取法变为唯一。

这里要先推出来,什么情况下会使得这个取走的节点有多种取法。
这里的结论是,如果有一条边的左右两侧节点数都恰好是n/2(此时n必然是偶数),那么我们分别取走这条边左右两侧的节点,剩下的部分最大节点数均为n/2。

推导这个结论可以用反证法,剩下的部分最大结点数大于n/2的反例就不说明了。
如果剩下的部分最大节点数小于n/2,那么代表取走那个点后,剩下的部分至少有三个,其中一个部分是当前的最大部分有x个结点,另外两个部分分别有y个和z个结点,y<=x,z<=x且x+y+z=n。
取走的这个点是三个部分的连接节点。
那么我们如果不取这个点的话,这三个部分的至少两个部分会连接起来构成一个更大的部分,
由于x+y>x,x+z>x,y+z>x
也就是说我们取其他的点都是会得到比x更大的部分,由此推翻。

寻找这样一条左右两侧节点数均为n/2的“中间边”我们可以通过dfs来得到,那么得到后我们要如何删边加边构造没有这种“中间边”的树呢。
我们注意到这个“中间边”的存在,其实也就是这个子树可以分成两个恰好拥有n/2节点的部分,且两个部分只有一条连边。
我们只需要让它们之间有多条连边即可。
我们用dfs找到这条“中间边”,这条边两侧的点中,u为更接近根节点的点,d为更远离根节点的点。那么我们可以从u的这一侧切出一个点出来(用树根这个点就可以了),把它和d接起来。
这样的话u这一侧就只有n/2-1个点了,再加上d这个点才凑满n/2个点,而d这个点和原本自己一侧至少有一个连边,切下来的原根节点与其又有一条连边,就不再有上述结论的情况了。

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

struct Edge
{
    ll to,next;
}edge[maxn*2];

ll head[maxn],ru[maxn],tot,n;//ru[i]数组代表i结点有几条边,用于寻找只有一条边的点作为树根起点
ll u,d;

void init()
{
    for(ll i=1;i<=n;i++) head[i]=-1,ru[i]=0;
    tot=0;
}

void add(ll u,ll v)
{
    edge[tot].to=v;
    edge[tot].next=head[u];
    ru[v]++;
    head[u]=tot++;
}

ll dfs(ll now,ll pre)//dfs返回值为now以及它的子树总共有几个结点,pre为之前的一个节点,用于dfs防止走回头路
{
    ll ret=1;
    for(ll i=head[now];i!=-1;i=edge[i].next)
    {
        ll to=edge[i].to;
        if(to!=pre) ret+=dfs(to,now);
    }
    if(ret==n/2)//如果当前结点的个数恰好等于总结点数的一半,则记录这条“中间边”两侧的两个点位置,u是更接近根节点那一侧的点
    {
        u=pre;
        d=now;
    }
    return ret;
}


int32_t main()
{
    IOS;
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        init();
        for(ll i=1;i<n;i++)
        {
            ll u,v;
            cin>>u>>v;
            add(u,v);add(v,u);
        }
        if(n&1)//如果总结点数是奇数个则无需进行操作,任意切掉一条边再重新把这条边构造还原即可
        {
            ll now=1;
            ll to=edge[head[now]].to;
            cout<<now<<' '<<to<<endl;
            cout<<now<<' '<<to<<endl;
        }
        else//如果结点数是偶数个,那么去找是否有哪边边的两侧恰好结点数都是总数的一半,就会出现去除该条边两侧的两个点后,得到的剩余部分的最大结点数相等的情况
        {//此时最大结点数都是n/2,我们需要构造使得这种情况不再出现
            ll start=-1;//start为树根节点,挑选只有一条边的叶子作为树根(如果选择树内部而不是叶子作为起点去dfs检测子树节点数量是否等于n/2是不正确的,因为还可能通过树根和其他子树的部分加起来构成n/2的一个子树,以另一个点为树根的情况下)
            for(ll i=1;i<=n;i++) if(ru[i]==1) start=i;
            u=d=0;//u为那条“中间边”两侧的点中离根节点较近的点,d为较远的
            dfs(start,0);//dfs检测是否存在这样一条“中间边”,左右两侧的节点数都是n/2
            ll to=edge[head[start]].to;//to为与根节点相连的唯一一个点的位置,用于后面构造操作
            if(u==0)//如果不存在这样的“中间边”则无需操作,任意切掉一条边再重新把这条边构造还原即可
            {
                cout<<start<<' '<<to<<endl;
                cout<<start<<' '<<to<<endl;
            }
            else//如果存在这样的“中间边”,从这条边的u那一侧切割下一个点,这里切割下树根节点,然后拼接到另一侧的d点上即可
            {
                cout<<start<<' '<<to<<endl;
                cout<<start<<' '<<d<<endl;
            }
        }
    }
}

D题
贪心,结论,差分

题意为给定一个长度为n的数列A,你需要构造一个长度为n的值不下降的数列B和一个长度为n的值不上升的数列C,满足B[i]+C[i]=A[i]。现在问你数列B和数列C中的最大数值的最小值是多少。

注意到我们只需要关注数列B和C中的最大值,数列B中的最大值是最后一个数字,数列C中的最大值是第一个数字。
我们可以假设固定了数列C中的第一个数字为x,那么数列B中的第一个数字就是A[1]-x。
之后我们依次向后看Ai的值,
如果A[i]<=A[i-1],如果我们仍然按照i-1的位置构造B和C的话,加起来会大于A[i],我们需要减小数字,我们可以直接减少数列C的数字即可,并且不会影响到B和C中的最大值是度搜好。
如果A[i]>A[i-1],如果我们仍然按照i-1的位置构造B和C的话,加起来会小于A[i],我们需要增大数字,我们不能增加数列C的数字值,只能增加数列B的,而这个增加值会影响B中最后一个数字的大小,也就是会影响到最后的最大值。

我们累加A[i]-A[i-1]中大于0的部分,值为temp,那么这样贪心构造后的数列B中的最大值就位A[1]-x+temp,而数列C中的最大值为x,我们希望他们中的最大值尽可能小。也就是两者相加平均分成两部分后较大的那部分了,而两者相加值为A[1]-x+temp+x=A[1]+temp。
因此我们实际上只需要关注第一个位置的数,和后面的数字的差分数组中大于0的部分即可。
我们可以通过差分数组O(1)进行修改操作并得到结果。

另外注意下A[1]+temp是负数的时候,除以2是向上取整的。

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

vector<ll>num;

int32_t main()
{
    IOS;
    int n;
    cin>>n;
    num.resize(n+1);
    for(ll i=1;i<=n;i++) cin>>num[i];
    ll ans=num[1];
    for(ll i=n;i>1;i--)//差分操作
    {
        num[i]-=num[i-1];
        if(num[i]>0) ans+=num[i];
    }
    cout<<(max(ans/2,ans-ans/2))<<endl;//注意负数除以2是向上取整而不是向下,所以这里这么写是最稳妥的
    ll q;
    cin>>q;
    for(ll i=0;i<q;i++)
    {
        ll l,r,x;
        cin>>l>>r>>x;
        if(l>1)
        {
            if(num[l]>0) ans-=num[l];
            if(num[l]+x>0) ans+=num[l]+x;
        }
        if(l==1) ans+=x;//ans是num[1]加上后序差分数组大于0的部分,如果改变区间左侧就是1的话,直接要把x加到ans上
        if(r<n)
        {
            if(num[r+1]>0) ans-=num[r+1];
            if(num[r+1]-x>0) ans+=num[r+1]-x;
        }
        num[l]+=x;
        if(r<n) num[r+1]-=x;
        cout<<max(ans/2,ans-ans/2)<<endl;
    }
}
三. zemax光学设计流程+案例 文章目录zemax 基本操作:1. 建立光学基本模型2. 像质评价3. 优化(重点)4. 公差分析简单镜头设计 zemax 基本操作: 1. 建立光学基本模型 2. 像质评价 3. 优化(重点) 对系统设定的约束条件或目标值 统称为操作数。 操作数: 光学特性参数(焦距EFFL,近轴放大率PMAG,入瞳位置EMPP) 像差参数(球差SPHA,彗差COMA,像散ASTI) 边界条件(中心厚度值CTVA,边缘厚度值ETAV) 优化的主要步骤: 设置评价函数和优化操作数 一般小像差系统采用波像差 构建 阅读详情

相关推荐

Cursor生成JAVA相关的关键词提示规则

你是 Java 编程、Spring Boot、Spring Framework、Maven、JUnit 及相关 Java 技术的专家。在项目根目录创建一个.curstorrules文件(注意有个小数点),之后在该文件内填入下面内容。始终遵循 SOLID 原则,保持高内聚低耦合的 Spring Boot 应用设计。Java 和 Spring Boot 使用规范。Spring Boot 具体规范。

kitonGao的博客 2115

Codeforces Round #670 (Div. 2)

A http://codeforces.com/contest/1406/problem/A 桶排个序,记录一下个数,然后从小到大扫两遍,每次直到个数为零的那个数,将他们加起来即可。 #include <bits/stdc++.h> using namespace std; int T,ans,n,i,GG,f[200],a[200]; int main(){ cin >>T; while (T--){ ans=0; cin >>n; memset(f

hehepig的博客 190

OpenClaw Docker 安装问题解决全记录

控制面板无法加载(WebSocket 错误) | 确认 Nginx 配置中的 `Upgrade` 和 `Connection` 头正确 || 网关容器无法启动 | `docker compose logs openclaw-gateway`,检查权限、镜像名 |如需消除,使用 Let's Encrypt |- `<your-token>`:你的 OpenClaw 网关令牌(如 `b0e5ab...`)将 `<nas-ip>` 替换为你的群晖内网 IP(例如 `192.168.1.100`)。

u014490376的博客 2308

Codeforces Round #670 (Div. 2)A~D总结

比赛传送门 Codeforces Round #670 Div. 2A题 Subset MexB题暴力做法题解做法C题D题 A题 Subset Mex ☠不难,静下心来! 题意 将给定数组分成两份,使得两份数组的 mex 值之和最大。 对mex 的定义为:数组中未出现的最小的大于等于零的整数。 例如: mex(1,4,0,2,2,1)=3m e x ( 1 , 4 , 0 , 2 , 2 , 1 ) = 3mex(1,4,0,2,2,1)=3 mex(3,3,2,1,3,0,0)=4m e x ( 3

rainbowsea_1的博客 411

C#操作SQLite数据库帮助类——SQLiteHelper

using System; using System.Collections.Generic; using System.Data.SQLite; using System.Data; namespace Com.ZCWL.Rock.Helper { public class SQLiteHelper { private static string connectionString =

跟健哥出去走走 2万+

SGO基线解算软件(南方测绘UI设计最美观的一款新版)

不多说,先放地址: 下载地址:https://www.southgnss.com/download_view.asp?did=361 SGO是南方测绘集团广州南方卫星导航仪器有限公司自主研发新一代南方地理数据处理平台软件,对南方特有数据格式文件(STH格式文件)、标准数据格式文件(RINEX格式文件)进行静态数据处理、动态数据后处理和进行RTK结果检验,新增加了北斗数据处理和摄影测量模块,并围绕南方的不同类型测量产品集成多款测绘领域所需的小工具,实现测绘内业数据处理一体化。 相关概念 G..

heirenqiaoke的博客 1万+

Codeforces Round #670 (Div. 2) 题解

A 简单的贪心,就直接上代码了: #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; #define maxn 110 int T,n,a[maxn],b[maxn]; int main() { scanf("%d",&T);while(T--) { scanf("%d",&n); mem

a_forever_dream的博客 293

Minitab正交试验设计:从入门到精通的完整指南

本文提供了一份使用Minitab进行正交试验设计的完整指南。从正交试验省时省力的原理讲起,详细介绍了在Minitab中创建正交表、填入数据、执行分析(包括解读ANOVA和P值)以及寻找最优参数组合的全流程。文章旨在帮助读者,特别是工艺优化和研发人员,快速掌握这一高效工具,从而用最少的实验次数锁定关键影响因素,提升工作效率与成果。

weixin_29201313的博客 463

Codeforces Round #670 (Div. 2) C D E

C. Link Cut Centroids C. Link Cut Centroids 题意:给定一棵n个节点的树,假设n个节点中,如果去掉其中一个节点k(包括节点所含的所有边)后,各个联通块中所含的最大点的数量最小,那么节点k就是这个树的质心。 现在有两个操作 选择两个节点a1,a2a_1,a_2a1​,a2​并删去这两者间的边 选择两个节点a1,a2a_1,a_2a1​,a2​并将两点相连 要求在两次操作后,使得这颗树的质心惟一。 思路: 仔细观察题目里面给定的有两个质心的图: 再连续手造几个图,

手扶拖拉机如何改装四驱 187

SLAM 轨迹评估工具——EVO安装、使用介绍

evo是一款用于视觉里程计和SLAM问题的轨迹评估工具. 核心功能是能够绘制相机的轨迹, 或评估轨迹与真值之间的误差. 支持多种数据集的轨迹格式(TUM、KITTI、EuRoC MAV、ROS的bag), 同时支持这些数据格式之间的相互转换,本文轨迹展示以tum数据格式为例。

u010196944的博客 1万+

ComfyUI 汉化教程(中文界面)

如果你对翻译的结果不满意,还可以进行修改。首先,进入目录,可以看到该目录中有很多 JSON 文件:打开 JSON 文件,找到要修改的内容,修改对应的Value值即可:最后,重启 ComfyUI 即可。

水滴的博客 1万+

Codeforces Round #670 (Div. 2) C.Link Cut Centroids,D.Three Sequencest题解

1406C. Link Cut Centroids 题意:给一颗树,定义树的质心为:将质心及质心所连的所有边剔除之后,生成的联通块的大小的最大值最小的点。要求删除一条边,再加入一条边,使得新图仍然是树且质心唯一。 思路:通过质心的定义就能够明白树的质心至多2个,且若质心有两个,这两个质心必定是父子节点的关系。那么这个问题就很好解决了,只有两种可能:1.质心只有一个。那么只要不改变树本身的样子,即删除、添加任意的一条边,质心仍然唯一;2.质心有两个。那么只要将两个质心的其中一个质心按照剔除的规则生成的

SarenSage的博客 253

yolov5-6.0的稀疏化训练、结构化剪枝、微调

YOLOv5的BN剪枝、微调

qq_41920323的博客 4394

CF-Round #633 (Div. 2) A-D

题目传送门 Codeforces Round #633 (Div. 2) A-D A. Filling Diamonds 题目挺长的,乍一看,好像很难,但是这题其实只用输出n。 他问的是有多少种方式填充完这张图,其实就是选取直着的菱形的位置。 B. Sorted Adjacent Differences 题目的意思是给你一个长为n的数组a,要你把这个a数组排序成|a1a_{1}a1​−a2a_...

baddog的博客 371

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

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Codeforces Round #670 (Div. 2) solution

..

curry的博客 216

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Codeforces Round #670(Div. 2) A,B,C,D,E

文章目录A. Subset MexB. Maximum ProductC. Link Cut CentroidsD. Three SequencesE. Deleting Numbers A. Subset Mex 桶排序,遇到没有的x,直接加上A,B剩下数量*x,遇到只剩一个的,如果A,B都还在,那么让一个结束,答案加上x,否则继续。 #include <iostream> #include <stdio.h> #include <cstring> #include &

hhhcbw的博客,欢迎各位来访 213

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

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

Codeforces Round #350 (Div. 2) ABCDE

传送门:http://codeforces.com/contest/670 A(写的很啰嗦...): #include using namespace std; typedef long long ll; const int INF=0x3f3f3f3f; const int maxn=1000005; int T,n,m; int main(){ while(~scanf("

To be excellent! 643

Codeforces Round #670 (Div. 2) D. Three Sequences(思维)

题目链接:https://codeforces.ml/contest/1406/problem/D   题目大意:   给一个序列ai,有一个非递减序列bi和非递减序列ci,要求每一个位置上的bi和ci的和要等于ai,要求bi和ci中的最大值最小,求这个最大值。同时有修改操作,q次修改,给l到r区间的数字加x,1<=n<=105,1<=q<=1051<=n<=10^5,1<=q<=10^51<=n<=105,1<=q<=105

smilestruggler_Fly To Higher 237

Codeforces Round #670 (Div. 2) A-D

题目????:link 题解连接: A. Subset Mex B. Maximum Product C. Link Cut Centroids D. Three Sequences 学习连接: https://blog.csdn.net/zstuyyyyccccbbbb/article/details/108560772

我是蒋卫升呀~ 306

[codeforces]round670 D. Three Sequences

#include<bits/stdc++.h> #define debug(x) cout<<#x<<" is "<<x<<endl #define fi first #define se second #define pb push_back #define mp make_pair #define DBG 0 const int N = 1e5 + 5; typedef long long ll; const int INF = 0x3f3f.

我们仍未知道那天所看见的花的名字。 2118

Codeforces Round #350 (Div. 2) A B C D1 D2 E

链接:http://codeforces.com/contest/670 A:7天内有连续5天工作2天休息,给你天数,问最少和最大可以休息的天数。 显然(1)开始就是工作时休息最少,(2)开始是休息时休息最多。(2)把先休息的减掉变成(1)。 #include #include #include #include #include #include #include #incl

Fb_by 1449

Codeforces Round #670 (Div. 2) D. Three Sequences

题目链接 You are given a sequence of nnn integers a1,a2,…,ana_1, a_2, \ldots, a_na1​,a2​,…,an​. You have to construct two sequences of integers bbb and ccc with length nnn that satisfy: for every iii (1≤i≤n1\leq i\leq n1≤i≤n) bi+ci=aib_i+c_i=a_ibi​+ci​=ai​ bb

sky123博客 633

Codeforces Round #670 (Div. 2) E. Deleting Numbers

交互 分块

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值