Codeforces Round 881 Div.3

news2025/1/20 1:39:31

文章目录

    • 贪心:A. Sasha and Array Coloring
    • 结论:B. Long Long
    • 性质:C. Sum in Binary Tree
    • dfs求叶子数量:D. Apple Tree
    • 二分与前缀和:E. Tracking Segments

贪心:A. Sasha and Array Coloring

Problem - A - Codeforces
image.png

将数组中的每个数染色,同一颜色的数字中,将最大值与最小值相减得到分数,问:所有的染色方案中,总分最高是多少
显然,同一颜色的数字除了最大和最小,其他的数没有用,要使总分最高,同一颜色的数字要最少,最少为两个
将数组的最大与最小相减得到分数,再将次大与次小相减…

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 55;
int a[N], T;

int main()
{
    cin >> T;
    while ( T -- )
    {
        int n, sum = 0;
        cin >> n;
        for (int i = 0; i < n; ++ i ) cin >> a[i];
        sort(a, a + n);
        int l = 0, r = n - 1;
        while (l < r)
        {
            sum += (a[r] - a[l]);
            l ++ , r -- ;
        }
        cout << sum << endl;
    }
    return 0;
}

结论:B. Long Long

image.png

sum一定是所有数绝对值之和
结论:最少操作次数等于连续负数子段个数,所有统计连续非负的子段数量即可

#include <iostream>
#include <cmath>
using namespace std;

typedef long long LL;
const int N = 2e5 + 10;
int a[N], T;

int main()
{
    cin >> T;
    while ( T -- )
    {
        LL n, sum = 0, cnt = 0;
        cin >> n;
        for (int i = 0; i < n; ++ i) 
        {
            cin >> a[i];
            sum += abs(a[i]);
        }
        for (int i = 0; i < n;)
        {
            if (a[i] < 0)
            {
                cnt ++ ;
                while (i < n && a[i] <= 0) i ++ ;
            }
            else i ++ ;
        }
        cout << sum << ' ' << cnt << endl;
    }
    return 0;
}

debug:ans要开LL,wa了4发,非负子段中可以出现0,所以a[i] < 0是不行的


性质:C. Sum in Binary Tree

Problem - C - Codeforces
[外链图片转存中…(img-XlnHbBnn-1692359176162)]

一颗完全二叉树,根节点编号为1号,问根节点到n号节点的编号之和
手写堆时,学过:孩子的编号 / 2为父亲的编号,父亲的编号 * 2,或* 2 + 1能得到左右孩子的编号
若从1开始走到n,路径是无法一次确定的。从n走到1,路径能一次确定。所以将n不断/2,就能走到根节点,过程中维护sum即可

#include <iostream>
using namespace std;

typedef long long LL;

int main()
{
    int T;
    cin >> T;
    while ( T -- )
    {
        LL sum = 0, n;
        cin >> n;
        while (n)
        {
            sum += n;
            n /= 2;
        }
        cout << sum << endl;
    }
    return 0;
}

dfs求叶子数量:D. Apple Tree

Problem - D - Codeforces
image.png

对于所有节点1~n,求以每个节点为根节点时,子树中叶子节点的数量leaf[i]
答案为leaf[x] * leaf[y]

用dfs求叶子节点的数量,有两个坑:树要建无向边,一开始我自以为是有向边,方向从根节点向下,但通过用例就能看出这是无向边
其次,无向树较难实现在线求叶子节点数量,一开始我写的是有向树,用dfs在线求叶子节点数量很好实现。但是无向树想要在线求,有一个问题,dfs会向根节点遍历,虽然能特判根节点不是叶子,但是dfs会遍历到不属于当前子树的叶子
解决方法是:用根节点开始dfs,用leaf数组保存每颗子树的叶子节点,从其他节点开始地离线求法依然是错的,只能从根节点开始求

#include <iostream>
#include <cstring>
using namespace std;

typedef long long LL;
const int N = 2e5 + 10, M = 4e5 + 10;
int h[N], e[M], ne[M], idx;
int T, n, Q;
int leaf[N];

void add(int x, int y)
{
    e[idx] = y, ne[idx] = h[x], h[x] = idx ++ ;
}

int dfs(int x, int fa)
{
    bool flag = true;
    int cnt = 0;
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int y = e[i];
        if (y != fa) flag = false, leaf[x] += dfs(y, x);
    }
    if (flag) leaf[x] = 1; 
    return leaf[x];
}


int main()
{
    cin >> T;
    while ( T -- )
    {
        memset(h, -1, sizeof h);
        memset(leaf, 0, sizeof leaf);
        idx = 0;
        cin >> n;
        int x, y;
        for (int i = 0; i < n - 1; ++ i )
        {
            cin >> x >> y;
            add(x, y), add(y, x);
        }
        cin >> Q;
        dfs(1, -1);
        while ( Q -- )
        {
            cin >> x >> y;
            cout << (LL)leaf[x] * leaf[y] << endl;
        }
    }
    return 0;
}

二分与前缀和:E. Tracking Segments

Problem - E - Codeforces
image.png

每次做二分题脑子都转不过来,要将边界问题考虑得很清楚
首先,分析题意:一个元素全为0的数组,给定m个区间与q个操作,每次操作将某个元素置为1,问第几次操作时,m个区间中至少有一个区间的1的数量大于0的数量
可以看出这题具有二段性,由于每次操作都是将0置为1,所以整个数组中1的数量随着操作次数增加。假设答案为ans,进行ans次操作后,有一个区间的1数量大于0数量。那么在之后的操作中,1的数量只增不减。所以对于第 [ a n s , m ] [ans, m] [ans,m]次操作,至少有1个区间的1数量大于0数量
而在进行第 [ 1 , a n s − 1 ] [1, ans-1] [1,ans1]次操作时,所有区间1的数量一定小于0的数量,操作次数呈现两段性

根据操作次数 [ 1 , q ] [1, q] [1,q]的两段性,我们可以二分出两段区间的分界点,即最终答案ans
每次check时,进行mid次操作,遍历所有区间,只要有区间的1数量大于0数量,check就返回true。说明mid落在了右半段区间,r = mid。若check为false,说明mid落在左半区间,l = mid + 1

什么情况下会无解?进行了q次操作后,依然没有一个区间的1数量大于0数量,此时无解。那么无解时,会二分到哪个答案?因为操作次数的范围为 [ 1 , q ] [1, q] [1,q],所以无解时操作次数为 q + 1 q + 1 q+1
因此二分的区间需要设置为 [ 1 , q + 1 ] [1, q + 1] [1,q+1],当最后的结果为 q + 1 q + 1 q+1时,无解

用前缀和求区间中1的数量

#include <iostream>
#include <cstring>
using namespace std;

const int N = 1e5 + 10;
int n, m;
int a[N], T, Q, L[N], R[N], change[N];

bool check(int mid)
{
    for (int i = 1; i <= m; ++ i) 
    {
        int ones = a[R[i]] - a[L[i] - 1];
        if (2 * ones > R[i] - L[i] + 1) return true;
    }
    return false;
}

int main()
{
    cin >> T;
    while ( T -- )
    {
        cin >> n >> m;
        for (int i = 1; i <= m; ++ i ) cin >> L[i] >> R[i];
        cin >> Q;
        for (int i = 1; i <= Q; ++ i ) cin >> change[i]; 
        int l = 0, r = Q + 1;
        while (l < r)
        {
            int mid = l + r >> 1;
            memset(a, 0, sizeof a);
            for (int i = 1; i <= mid; ++ i ) a[change[i]] = 1;
            for (int i = 1; i <= n; ++ i ) a[i] += a[i - 1];
            if (check(mid)) r = mid;
            else l = mid + 1;
        }
        if (r == Q + 1) puts("-1");
        else cout << r << endl;
    }
    return 0;
}

debug:check要建立所有的区间,所以for循环中,i <= m,我写成了i <= mid,WA两发
i <= mid应该是枚举操作时的条件


剩下两题有些难,20号之后回来补

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

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

相关文章

作为10年的测试人员给学习软件测试的几点建议

下面几点给做测试的朋友参考一下&#xff1a; 1、钱肯定少过开发人员&#xff0c;除非你工作3&#xff0c;4年才能拿年薪10W以上。 2、加班的现象可以说是很普遍&#xff0c;周一到周五随时加班是很正常的&#xff0c;周末肯定有一天要加班。 3、不管怎么样努力和用什么测试效…

ROS局部路径规划器插件teb_local_planner流程梳理(上)

在我之前的文章《ROS导航包Navigation中的 Movebase节点路径规划相关流程梳理》中已经介绍过Move_base节点调用局部路径规划器插件的接口函数是computeVelocityCommands&#xff0c;接下来&#xff0c;我们就从这个函数入手梳理一下teb_local_planner功能包的工作流程。 ☆注&a…

Vue使用Element的表格Table显示树形数据,多选框全选无法选中全部节点

使用Element的组件Table表格&#xff0c;当使用树形数据再配合上多选框&#xff0c;如下&#xff1a; 会出现一种问题&#xff0c;点击左上方全选&#xff0c;只能够选中一级树节点&#xff0c;子节点无法被选中&#xff0c;如图所示&#xff1a; 想要实现点击全选就选中所有的…

强强联手:Eyeshot 2023.2 集成 CAD Exchanger SDK 3.21 Crack

Lab 中的新绘图模式和网格抽取、Eyeshot 集成以及从 CAD Exchanger 3.21.0 中的 CATIA 导入图形 PMI 通过探索新的绘图模式和可调整的网格抽取&#xff0c;更深入地了解实验室&#xff0c;见证与 devDept Eyeshot 的无缝集成&#xff0c;并直接从 CATIA 导入图形 PMI。 今年 8…

阿里云100元预算可选的云服务器配置2核2G3M带宽

阿里云服务器100元可以买到哪些配置&#xff1f;如果是一年时长&#xff0c;轻量应用服务器2核2G3M带宽一年108元&#xff0c;系统盘为50GB高效云盘。以前阿里云服务器ECS卖过35元一年、69元、88元、89元和99元的都有过&#xff0c;但是现在整体费用上涨&#xff0c;入门级云服…

超实用的40道JAVA经典算法题(含答案)

作为一名Java程序员&#xff0c;想要拿到一份满意的offer&#xff0c;就必须做好充足的准备。众所周知&#xff0c;算法可以说是大厂面试Java程序员的必问题。好的算法可以让性能得到万倍提升&#xff0c;做到毫秒级处理千万数据的程度。因此&#xff0c;算法的重要性不言而喻&…

【云原生,k8s】Helm应用包管理器介绍

目录 一、为什么需要Helm&#xff1f; &#xff08;一&#xff09;Helm介绍 &#xff08;二&#xff09;Helm有3个重要概念&#xff1a; &#xff08;三&#xff09;Helm特点 二、Helm V3变化 &#xff08;一&#xff09;架构变化 &#xff08;二&#xff09;自动创建名…

ICCV23 | Ada3D:利用动态推理挖掘3D感知任务中数据冗余性

​ 论文地址&#xff1a;https://arxiv.org/abs/2307.08209 项目主页&#xff1a;https://a-suozhang.xyz/ada3d.github.io/ 01. 背景与动因 3D检测(3D Detection)任务是自动驾驶任务中的重要任务。由于自动驾驶任务的安全性至关重要(safety-critic)&#xff0c;对感知算法的延…

CodeSite for .NET Crack

CodeSite for .NET Crack CodeSite for.NET与Visual Studio集成&#xff0c;通过实时查看器日志记录系统提供对代码执行的更深入了解&#xff0c;该系统有助于在本地或远程执行代码时快速查找问题。超越传统的断点调试&#xff0c;在应用程序继续运行时记录应用程序的执行&…

强训第34天

选择 A B D 由协议处理粘包问题 C C C host字段表示要访问的IP地址 Connection为Close&#xff0c;为短连接 A RTT报文往返时间&#xff0c;根据窗口大小和拥塞控制可以得知发了1 2 4 8 总共16个接收缓存并且没由进行数据提取&#xff0c;则剩余接收量为16-151&#xff0c;会经…

k8s简介、虚拟机快速搭建k8s集群、集群管理方式及K8S工作原理和组件介绍

文章目录 1、k8s简介1.1、部署方式的变迁1.2、定义1.3、Kubernetes提供的功能 2、虚拟机快速搭建k8s集群2.1、虚拟机配置&#xff08;centos7 2G内存2个处理器&#xff09;2.2、基础环境准备2.3、docker安装&#xff08;易踩坑&#xff09;2.4、安装k8s组件2.5、master节点部署…

Power BI 之 初相识

一、简介 传统数据分析工具入Excel等分析大数据量存在一些弊端&#xff0c;一是无法应对多数据源&#xff0c;二是数据量大容易卡死&#xff0c;三是无法根据数据源动态变化&#xff0c;导致每天重复分析数据&#xff0c;无法关注数据价值本身。 Power BI&#xff08;简写PBI…

隧道代理技术解析:为批量数据采集提供强大支持

嘿&#xff01;作为一名专业的爬虫程序员&#xff0c;我今天要和大家分享一个强大的技术&#xff0c;它能够为批量数据采集提供强大的支持——隧道代理技术。如果你在进行大规模数据采集任务时遇到了IP封禁和限制的问题&#xff0c;那么这项技术将是你的救星。废话不多说&#…

案例-基于MVC和三层架构实现商品表的增删改查

文章目录 0. 项目介绍1. 环境准备2. 查看所有2.1 编写BrandMapper接口2.2 编写服务类&#xff0c;创建BrandService&#xff0c;用于调用该方法2.5 编写Servlet2.4 编写brand.jsp页面2.5 测试 3.添加3.1 编写BrandMapper接口 添加方法3.2 编写服务3.3 改写Brand.jsp页面&#x…

【使用群晖远程链接drive挂载电脑硬盘】

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…

用pytorch实现AlexNet

AlexNet经典网络由Alex Krizhevsky、Hinton等人在2012年提出&#xff0c;发表在NIPS&#xff0c;论文名为《ImageNet Classification with Deep Convolutional Neural Networks》&#xff0c;论文见&#xff1a;http://www.cs.toronto.edu/~hinton/absps/imagenet.pdf &#xf…

原型设计必备,10个简单好用的界面工具推荐

在数字产品和应用设计过程中,使用简单实用的界面原型设计工具至关重要。它可以将设计理念快速转换为交互原型,便于团队成员之间的沟通和协作。对设计新人来说,选择一个上手快速、功能强大的界面原型设计工具尤其关键。本文将推荐10款常用的界面原型设计工具,帮助初学者找到适合…

解决C/C++/QT url中含有特殊字符转码的问题

一、http请求链接中的特殊字符处理 解决包括Postman 中的post、get等链接请求中的特殊字符(如:*,#,{},[],^,%,(,?,!..等等)的情况 1、场景: 特殊字符存在,报400错误 2、原因 如果请求的参数带有一些特殊字符,如 +,%,=等,如果没有进行URL编码可能在发送请求的时候,后…

WinPlan经营大脑垂直大模型行业报告

一、引言 在当前高度信息化的时代,企业经营管理决策的重要性已经得到了广泛的认可。然而,在实际操作中,许多企业仍然在凭经验、拍脑袋进行经营决策,缺乏数据工具与专职分析团队,导致决策难、效率低等问题。针对这一问题,近年来,一种名为“WinPlan”的经营决策产品逐渐崭…

NVIDIA vGPU License许可服务器高可用全套部署秘籍

第1章 前言 近期遇到比较多的场景使用vGPU&#xff0c;比如Citrix 3D场景、Horizon 3D场景&#xff0c;还有AI等&#xff0c;都需要使用显卡设计研发等&#xff0c;此时许可服务器尤为重要&#xff0c;许可断掉会出现掉帧等情况&#xff0c;我们此次教大家部署HA许可服务器。 …