【上分日记】第381场周赛(差分 + 分类讨论)

前言

 这次博主做了三道题,算是第一次,看来是题出的简单了(hhh,小白勿喷),不过还是有不错的进步,继续加油,这次最后一题分类讨论也是挺让人头疼的,下面我们好好总结一下。

正文

1.3017. 按距离统计房屋对数目 II

  • 题目链接:3017. 按距离统计房屋对数目 II

  • 题目思路:

 这道题算是折磨了我一整天,虽然分类讨论出来了,但是实现代码时细节比较多,一不小心出现一个失误就要debug好久。

下面我们来仔细分析一下:

  • 前置知识:1094. 拼车——差分模版题,看灵神题解快速掌握。
  1. 我们先从大体上分析一下:
  • 我们可以先统计出不看 x,y 联系的最短距离,再根据 x,y 对一个点的影响再进行分类讨论,从而得出最短距离。
  • 而且所有房屋的编号是按顺序的,房子的最大编号为n,那么设 i 号房屋,不看x , y 产生的距离可对i左边分析距离在[1, i - 1]之间, 再对i右边分析距离在[1, n - i ]之间,那么这些距离都产生了一次.
  • 那么我们就可以联系到差分数组,对这些距离出现的次数可以在O(1)的时间复杂度加1,也就是说我们可以用一个存放距离出现次数的差分数组,快速统计距离出现次数。
  • 最后我们再讨论x , y 带来的影响,对产生影响的区间撤销再补充即可。
  1. 其次我们再对 x, y 产生的影响,根据房子的编号进行分类讨论。以下得保证 x <= y。
  1. 当x + 1 >= y 时, x y 联系起来没有影响。
  2. 当x + 1 > y 时,x y 联系起来对房子编号产生的最短距离有影响,设房子编号为i。
  1. i <= x时:
  • 对于i 到 [y, n]的距离范围 [y - i, n - i] 产生了影响,进行撤销,缩短的距离为dec = y - x - 1, 这里的1是 y 到 x的一步距离,因此缩短之后的距离范围为[y - i - dec, n - i - dec]。
  • 对于i 到 (x,y)的距离,我们可以设其中一点为 j,设 j - i > (x - i + 1) + (y - j) 得出 j > (x+y+1) / 2, 因此可以得出j的准确范围为[(x + y + 1) / 2 + 1, y - 1], 那么可以得到原来的距离范围d_pre准确为 [ (x + y + 1) / 2 + 1 - i, y - 1 - i], 对其进行撤除,且可以得到现在的距离范围d_current准确的是[x - i + 2, (x - i + 1) + y - ((x + y + 1) / 2 + 1)],化简成 [x - i + 2, (x+ y) - (x + y + 1) / 2 - i] 即可,再化简就出bug(是上下取整的问题)了。
  1. x < i < ( x + y ) / 2 时,x 与 y 相连对中间的点(x + y) / 2 无影响。
  • 对于[y , n] 点产生的距离 [y - i, n - i] 产生了影响,进行撤销,缩短的距离为dec = (y-i)- (i-x+1),整理得dec = y + x - 1 - 2 * i, 则添加的距离为[y - i - dec, n - i - dec].
  • 对于[x, y ] 点产生影响的范围我们可以设其中一点为j, 设 j - i > (i - x + 1) + (y - j) 得出的j的表达式结果为:j > i + (y - x + 1) / 2, 得出 j 准确范围为[i + (y - x + 1) / 2 + 1, y - 1], 可以得出对[x,y]产生影响的原先的距离为d_prev [(y - x + 1) / 2 + 1, y - 1 - i], 且产生影响的现在的距离范围准确为[i - x + 2, i - x + 1 + y - (i + (y - x + 1) / 2 + 1)], 化简得[i - x + 2, y - x - (y - x + 1) / 2],无需再进一步化简,同理。
  1. (x + y + 1) / 2 < i < y时,如果 x + y 为奇数,(x + y + 1) / 2 是 偏右边的中间点,如果 x + y 为偶数,那么其为中间点。左边的
  • 可通过下图对称转换为第2种情况,在这里插入图片描述
  1. i >= y 时,也可通过上图的进行转换,从而转换为第1种情况。
  • 实现代码:
class Solution {
public:
    vector<long long> countOfPairs(int n, int x, int y) 
    {
        if(x > y) swap(x,y);
        vector<int> dif(n + 1,0);
        auto add = [&](int left,int right)
        {
            if(left > right) return;

            dif[left]++;
            dif[right + 1]--;
        };
        auto sub = [&](int left,int right)
        {
            if(left > right) return;
            dif[left]--;
            dif[right + 1]++;
        };
        auto update1 = [&](int x,int y,int i)
        {
            int dec = y - x - 1;
            //对[y - i,n - i]进行撤销
            //再对[y - i - dec,n - i - dec]添加
            sub(y-i,n-i);
            add(y-i-dec,n-i-dec);
            //再对[(x + y + 1) / 2 + 1 - i,y-1-i]撤销
            sub((x + y + 1)/2 + 1 - i, y - 1 - i);
            //再对[x-i+2,(x+y-1) / 2 - i] 添加
            add(x - i + 2, (y - x) / 2 - i);
        };
        auto update2 = [&](int x,int y, int i)
        {
            int dec = x + y - 1 - 2 * i;
            //对[y - i,n - i]进行撤销
            sub(y-i,n-i);
            //对[y - i - dec,n - i - dec]进行添加
            add(y - i - dec, n -i - dec);

            //对[(y - x + 1) / 2 + 1 - i, y - 1 - i]进行撤销
            sub((y - x + 1) / 2 + 1, y - 1 - i);
            //对[i - x + 2,  (y - x - 1) / 2]进行添加
            add(i - x + 2, y - x - (y - x + 1) / 2);
        };
        for(int i = 1; i <= n; i++)
        {
            add(1,i-1);add(1,n-i);
            if(x + 1 >= y) continue;
            else if(i <= x)
                update1(x,y,i);
            else if(i >= y)
                update1(n - y + 1, n - x + 1, n - i + 1);
            else if(i > (x + y + 1) / 2)
                update2(n - y + 1, n - x  + 1, n - i + 1);
            else if(i < (x + y) / 2)
                update2(x,y,i);
        }
        //差分相加得距离的次数。
        vector<long long> ans(n);
        long long sum = 0;
        for(int i = 1; i <= n; i++)
        {
            sum += dif[i];
            ans[i-1] = sum;
        }
        return ans;
    }
};  

总结

 本次周赛学到了差分,对分类讨论有了更为深刻的理解,看来有良好的数学功底,对于解这种题帮助还是很大的。

尾序

我是舜华,期待与你的下一次相遇!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RPC和HTTP,它们之间到底啥关系

既然有 HTTP 请求&#xff0c;为什么还要用 RPC 调用&#xff1f; gPRC 为什么使用 HTTP/2 Spring Cloud 默认是微服务通过Restful API来进行互相调用各自微服务的方法&#xff0c;同时也支持集成第三方RPC框架&#xff08;这里的说的RPC是特指在一个应用中调用另一个应用的接…

基于LLaMA Factory,单卡3小时训练专属大模型 Agent

大家好&#xff0c;今天给大家带来一篇 Agent 微调实战文章 Agent&#xff08;智能体&#xff09;是当今 LLM&#xff08;大模型&#xff09;应用的热门话题 [1]&#xff0c;通过任务分解&#xff08;task planning&#xff09;、工具调用&#xff08;tool using&#xff09;和…

074:vue+mapbox 加载here地图(影像瓦片图 v2版)

第074个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载here地图的影像瓦片图 v2软件版本。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共77行)相关API参考:专栏目标示例效果

React16源码: React中的resetChildExpirationTime的源码实现

resetChildExpirationTime 1 &#xff09;概述 在 completeUnitOfWork 当中&#xff0c;有一步比较重要的一个操作&#xff0c;就是重置 childExpirationTimechildExpirationTime 是非常重要的一个时间节点&#xff0c;它用来记录某一个节点的子树当中&#xff0c;目前优先级最…

链路聚合原理与配置

链路聚合原理 随着网络规模不断扩大&#xff0c;用户对骨干链路的带宽和可靠性提出了越来越高的要求。在传统技术中&#xff0c;常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽&#xff0c;但这种方案需要付出高额的费用&#xff0c;而且不够灵活。采用…

网络安全全栈培训笔记(55-服务攻防-数据库安全RedisHadoopMysqla未授权访问RCE)

第54天 服务攻防-数据库安全&Redis&Hadoop&Mysqla&未授权访问&RCE 知识点&#xff1a; 1、服务攻防数据库类型安全 2、Redis&Hadoop&Mysql安全 3、Mysql-CVE-2012-2122漏洞 4、Hadoop-配置不当未授权三重奏&RCE漏洞 3、Redis-配置不当未授权…

eNSP学习——配置通过FTP进行文件操作

原理概述&#xff1a; FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是在TCP/IP网络和Internet上最早使用的协议之一&#xff0c;在TCP/IP协议族中属于应用层协议&#xff0c;是文件传输的Internet标准。主要功能是向用户提供本地和远程主机…

RTDETR 引入 UniRepLKNet:用于音频、视频、点云、时间序列和图像识别的通用感知大卷积神经网络 | DRepConv

大卷积神经网络(ConvNets)近来受到了广泛研究关注,但存在两个未解决且需要进一步研究的关键问题。1)现有大卷积神经网络的架构主要遵循传统ConvNets或变压器的设计原则,而针对大卷积神经网络的架构设计仍未得到解决。2)随着变压器在多个领域的主导地位,有待研究ConvNets…

Leetcode—39.组合总和【中等】

2023每日刷题&#xff08;七十六&#xff09; Leetcode—39.组合总和 算法思想 实现代码 class Solution { public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {vector<vector<int>> ans;vector<int>…

Elasticsearch:介绍 kNN query,这是进行 kNN 搜索的专家方法

作者&#xff1a;来自 Elastic Mayya Sharipova, Benjamin Trent 当前状况&#xff1a;kNN 搜索作为顶层部分 Elasticsearch 中的 kNN 搜索被组织为搜索请求的顶层&#xff08;top level&#xff09;部分。 我们这样设计是为了&#xff1a; 无论分片数量多少&#xff0c;它总…

【学习】focal loss 损失函数

focal loss用于解决正负样本的不均衡情况 通常我们需要预测的正样本要少于负样本&#xff0c;正负样本分布不均衡会带来什么影响&#xff1f;主要是两个方面。 样本不均衡的话&#xff0c;训练是低效不充分的。因为困难的正样本数量较少&#xff0c;大部分时间都在学习没有用…

【linux】 查看 Linux 重启历史记录(reboot)

了解 Linux 重启日志 /var/log 目录隐藏着 Linux 日志机制的核心信息&#xff0c;它是记录系统活动的宝贵仓库。然而&#xff0c;仅仅有日志还不够&#xff0c;真正的难题在于&#xff0c;如何从大量数据中提炼出与系统重启相关的关键信息。 在 /var/log 目录中&#xff0c;可…

更改wpf原始默认按钮的样式

样式 代码 <Window x:Class"WpfApp4.Window1"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend/2008…

机械臂雅可比矩阵的矢量积理解和matlab实现

雅可比矩阵的第Ji列&#xff1a; 关于一些基本概念可以参考博客&#xff0c;部分细节如下&#xff1a; 每个移动关节&#xff0c;Ji可以这样计算&#xff1a; 每个旋转关节&#xff0c;Ji这样计算&#xff1a; 有时候要求按照末端执行器坐标系{n}来执行一些位移旋转之类的…

【QT+QGIS跨平台编译】之六:【LZMA+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、lzma介绍二、文件下载三、文件分析四、pro文件五、编译实践 一、lzma介绍 LZMA&#xff08;Lempel-Ziv-Markov chain-Algorithm的缩写&#xff09;&#xff0c;是一个Deflate和LZ77算法改良和优化后的压缩算法。 libLzma是基于LZMA压缩算法封装的开源库。2001年被…

如何用AirServer进行手机投屏?,Airserver 永久激活注册码

AirServer一款投屏神器&#xff0c;可以帮你轻松地将iPhone、iPad投屏到Mac。是不是经常看到游戏主播用AirServer投屏&#xff1f;此外&#xff0c;AirServer也是视频Up主必备工具之一&#xff01;用来录制演示教程不错。除了实现单个手机投屏到电脑或荧幕。如果你有多画面投屏…

界面控件DevExpress ASP.NET Data Grid组件 - 可快速处理各类型数据!(一)

由DevExpress开发的快速且功能完整的ASP.NET Web Forms的Data Grid组件&#xff0c;从全面的数据塑造和数据过滤选项到十多个集成数据编辑器&#xff0c;该套件提供了帮助用户构建极佳数据所需的一些&#xff0c;没有限制&#xff01; P.S&#xff1a;DevExpress ASP.NET Web …

R303 指纹识别模块功能实现流程

1 基本通信流程 1.1 UART 命令包的处理过程 1.2 UART 数据包的发送过程 UART 传输数据包前&#xff0c;首先要接收到传输数据包的指令包&#xff0c;做好传输准备后发送成功应答包&#xff0c;最后才开始传输数据包。数据包主要包括&#xff1a;包头、设备地址、包标识、包长…

表单的总数据为什么可以写成一个空对象,不用具体的写表单中绑定的值,vue3

<el-form :model"form" label-width"120px"><el-form-item label"Activity name"><el-input v-model"form.name" /></el-form-item> </el-form> const form ref({})from为空对象 在v-model里写form…

最新数据传输安全难点解决方案(上)

在数据量激增和网络环境日益复杂的背景下&#xff0c;确保数据在传输过程中的安全性、效率和可靠性&#xff0c;已成为众多企业亟需解决的问题。镭速小编将带大家探讨数据传输安全所面临的主要挑战&#xff0c;并介绍一些前沿的数据传输安全技术和策略&#xff0c;以供企业参考…