AtCoder Beginner Contest 366(D~E题解)

news2024/11/15 12:16:06

闲来无事去vp了一下之前放假没打的比赛,感觉需要总结的也就这两题吧,a,c都是水题,b只不过是实现有一点难,并不是很难写,d是一个需要自己推的三维前缀和,e也是一种前缀和,我当时没想到,看了大犇的代码才知道还能这么做

D - Cuboid Sum Query

题意:给你一个三维数组,然后给你q次询问,每次询问有一个起始位置和终止位置,然后问你这个的三维前缀和是什么

思路:用容斥原理推出三维前缀和的预处理式子和后面的结果式子

预处理的式子:

sum[i][j][k] = a[i][j][k]+sum[i-1][j][k]+sum[i][j-1][k]+sum[i][j][k-1]
                               - sum[i-1][j-1][k]-sum[i-1][j][k-1]-sum[i][j - 1][k - 1] 
                               +sum[i - 1][j - 1][k - 1];

处理两个点前缀和的式子 

 int ans = sum[rx][ry][rz] 
                 -sum[lx - 1][ry][rz]-sum[rx][ly - 1][rz]-sum[rx][ry][lz - 1] 
                 + sum[lx - 1][ly - 1][rz] +sum[lx - 1][ry][lz - 1] + sum[rx][ly - 1][lz - 1] 
                 -sum[lx - 1][ly - 1][lz - 1];

#include <bits/stdc++.h>
using namespace std;
int a[105][105][105];
int sum[105][105][105];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            for (int k = 1; k <= n; k++)
            {
                cin >> a[i][j][k];
            }
        }
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            for (int k = 1; k <= n; k++)
            {
                sum[i][j][k] = a[i][j][k]+sum[i-1][j][k]+sum[i][j-1][k]+sum[i][j][k-1]
				               - sum[i-1][j-1][k]-sum[i-1][j][k-1]-sum[i][j - 1][k - 1] 
							   +sum[i - 1][j - 1][k - 1];
            }
        }
    }
    int q;
    cin >> q;
    while (q--)
    {
        int lx, rx, ly, ry, lz, rz;
        cin >> lx >> rx >> ly >> ry >> lz >> rz;
        int ans = sum[rx][ry][rz] 
		         -sum[lx - 1][ry][rz]-sum[rx][ly - 1][rz]-sum[rx][ry][lz - 1] 
				 + sum[lx - 1][ly - 1][rz] +sum[lx - 1][ry][lz - 1] + sum[rx][ly - 1][lz - 1] 
				 -sum[lx - 1][ly - 1][lz - 1];
        cout << ans << '\n';
    }

    return 0;
}

 E - Manhattan Multifocal Ellipse

题意:就是给你n个点,然后问你,整个平面上,有多少个点,到这个n个点的总距离不超过d

思路:脑子里迅速出现的思路是纯暴力,看到数据,纯暴力肯定是不行的,时间复杂度巨高,那么我们就该换一种思路,想一想时间复杂度简单的,我看有些大犇是拿线段树做的,有的是前缀和做的,我还是更偏向于前缀和,线段树太冗长了

因为此题是曼哈顿距离,曼哈顿距离有个好处就是横纵坐标可以分开来计算,因此我们只需要先用pre数组去统计前 i 个点的横坐标之和,然后去统计可能出现的到n个点的距离,如果这个距离小于d,我们就用dist数组去统计其出现次数

然后我们要将dist数组变为累加和的形式,然后对y进行处理,用ans去统计可能的点数

如果有点到y的距离小于d,那么ans+dist(d-len)即可

#include<bits/stdc++.h>  
using namespace std;  
#define int long long 

int n, d; 

signed main()  
{  
    cin >> n >> d; 
    vector<int> x(n + 1), y(n + 1); 

    for (int i = 1; i <= n; i++) 
    {  
        cin >> x[i] >> y[i];
    }  

    sort(x.begin() + 1, x.end()); 
    sort(y.begin() + 1, y.end());   

    vector<int> pre(n + 1); 
    vector<int> dist(d + 1); // 定义用于存储距离的数组   

    for (int i = 1; i <= n; i++) // 计算 x 坐标的前缀和  
    {  
        pre[i] = pre[i - 1] + x[i]; // pre[i] 记录从 1 到 i 的 x 坐标和  
    }  

    for (int i = x[1] - d, j = 1; i <= x[n] + d; i++) // 遍历可能的 x 坐标  ,类似于扫描线,将可能出现的x的坐标都扫了一遍 
    {  
        while (j <= n && i == x[j]) // 处理与当前 i 坐标相等的点  
        {  
            j += 1;  
        }  
        
        // 计算所有点到当前i的距离 
        int len = (pre[n] - pre[j - 1] - (n-j+1) * i) + ((j - 1) * i - pre[j - 1]);  
        // 如果当前距离小于等于 d,增加对应的计数  
        if (len <= d)  
        {  
            dist[len] += 1;  
        }  
    }  

    // 计算不超过 d 的距离的累积和  
    for (int i = 1; i <= d; i++)  
    {  
        dist[i] += dist[i - 1];  
    }  

    for (int i = 1; i <= n; i++) // 计算 y 坐标的前缀和  
    {  
        pre[i] = pre[i - 1] + y[i]; // pre[i] 记录从 1 到 i 的 y 坐标和  
    }  

    int ans = 0; // 初始化答案为 0  

    for (int i = y[1] - d, j = 1; i <= y[n] + d; i++) // 遍历可能的 y 坐标  
    {  
        while (j <= n && i == y[j]) // 处理与当前 i 坐标相等的点  
        {  
            j += 1;  
        }  
        
        // 计算所有点到当前i的距离总和 
        int len = (pre[n] - pre[j - 1] - (n - j + 1) * i) + ((j - 1) * i - pre[j - 1]);  
        
        // 如果当前距离小于等于 d,增加对应的计数到答案  
        if (len <= d)  
        {  
            ans += dist[d - len]; // 累加符合条件的点对数量  
        }  
    }  
    
    cout << ans << endl; // 输出结果  
    return 0;  
}

 

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

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

相关文章

WEB渗透Win提权篇-白名单提权

提权工具合集包&#xff08;免费分享&#xff09;&#xff1a; 夸克网盘分享 往期文章 WEB渗透Win提权篇-提权工具合集-CSDN博客 WEB渗透Win提权篇-RDP&Firewall-CSDN博客 WEB渗透Win提权篇-MSSQL-CSDN博客 WEB渗透Win提权篇-MYSQL-udf-CSDN博客 WEB渗透Win提权篇-Acc…

什么是代码审查(Code Review)?它有什么好处?

代码审查&#xff08;Code Review&#xff09;是软件开发过程中一个至关重要的环节&#xff0c;它指的是团队成员之间相互检查、评估代码的过程。这一过程不仅涉及对代码质量的把控&#xff0c;更是提升团队整体编程能力、确保软件安全性的重要手段。在本文中&#xff0c;我们将…

CSRF 概念及防护机制

概述 CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;即跨站请求伪造&#xff0c;是一种网络攻击方式。在这种攻击中&#xff0c;恶意用户诱导受害者在不知情的情况下执行某些操作&#xff0c;通常是利用受害者已经登录的身份&#xff0c;向受害者信任的…

我是如何在一分钟之内,不用多次交互AI,就完成了指定任务

本文背景 为什么我的AI不听话&#xff1f; 为什么我用AI写知乎文、视频文案、豆瓣影评、工作日报、论文、商业策划案、标书、代码都一直得不到想要的效果&#xff1f; 为什么我的AI生成的都是没有价值的口水文&#xff1f; 大象经过大量的AI实战经验&#xff0c;给出了这些问题…

ESP32-C3在MQTT访问时出现“Last error code reported from esp-tls: 0x8001”和问题的分析(3)

接前一篇文章:ESP32-C3在MQTT访问时出现“Last error code reported from esp-tls: 0x8001”和问题的分析(2) 上一回讲解了所遇问题log中的“esp-tls: couldnt get hostname for :iot-emqx-pre.nanshe-tech.com: getaddrinfo() returns 202, addrinfo=0x0”,再来回顾一下。…

USB:物理接口

USB&#xff1a;物理接口 物理接口 从高级概述角度来看&#xff0c;USB 的物理接口具有两个组件&#xff1a;线缆和连接器。这些连接器将设备连接到主机上。 一个 USB 线缆包含由一个绝缘套保护的多个组件。该绝缘套下面是一个包含了一个带有铜面的外部扩展板。 外部扩展板内包…

为什么现在人工智能大部分都用python而不是其他软件呢?

大部分人都选择使用Python而不是其他软件&#xff0c;主要是因为Python具有多方面的优势&#xff0c;这些优势使其在众多编程语言中脱颖而出&#xff0c;成为许多领域&#xff0c;特别是IT和人工智能领域的首选。以下是几个主要原因&#xff1a; 1. 简单易学 Python的语法简洁…

PMP备考3A的心得分享

首先&#xff0c;每一位报考的都会收到一份学习计划表&#xff0c;一定要仔细阅读这张表&#xff0c;并与自己的时间结合起来&#xff0c;看是否会有很大的冲突&#xff0c;如果有&#xff0c;那么可以找老师帮忙解决。一般来说&#xff0c;学习计划表的时间安排是非常恰当的&a…

下载淘宝的短视频(通过第三方插件)

目录&#xff1a; 1、通过插件插件下载短视频 1&#xff09;获取“Microsoft Edge扩展” 2&#xff09;搜索“aix智能下载器” 3&#xff09;将插件钉在浏览器上 4&#xff09;嗅控并下载视频 2、从其他来源安装插件 1、通过插件插件下载短视频 1&#xff09;获取“M…

(二)Kafka离线安装 - Zookeeper下载及安装

一、下载 下载ZooKeeper之前&#xff0c;需要根据下载的Kafka版本&#xff0c;来确定ZooKeeper的版本。 Kafka官方地址&#xff1a;Apache Kafka 1、先下载源码版本&#xff0c;下载完后解压&#xff0c;在kafka-3.8.0-src\gradle目录下找到dependencies.gradle文件&#xff…

从 0 到 1 的Prompt 教程,来自Claude 官方,不会写 prompt的看这个足够

Claude 的强大&#xff0c;最近得到了很多网友的验证&#xff0c;甚至效果上面大有超越 GPT的许多声音。 所以从优秀的 Claude 中学习&#xff0c;将会是一个很好的起点。 这里&#xff0c;Claude 的开发者们提供了一个相当详细的 Prompt Engineering 教程。 这个教程能够全面…

USB3.2 摘录(13)

系列文章目录 USB3.2 摘录&#xff08;一&#xff09; USB3.2 摘录&#xff08;二&#xff09; USB3.2 摘录&#xff08;三&#xff09; USB3.2 摘录&#xff08;四&#xff09; USB3.2 摘录&#xff08;五&#xff09; USB3.2 摘录&#xff08;六&#xff09; USB3.2 摘录&…

SpringBoot JPA 语法大全

Keyword:为关键词 Sample:为直接用在方法名上的例子 JPQLsnipper:为JPQL,Query的写法的例子

redhat7.9安装zsh以及常用插件

1 安装zsh并更改默认终端 #1.安装软件包 yum -y install zsh git#2.更改默认终端 chsh -s /bin/zsh然后再退出下终端&#xff0c;重新登录用echo $SHELL 查看环境是否是/bin/zsh 2 配置oh-my-zsh #1.从git仓库中拉取oh-my-zsh git clone https://gitee.com/mirrors/oh-my-z…

【私有云场景案例分享②】批量装包与冒烟测试的自动化实现

一、前言 在软件开发和测试过程中&#xff0c;批量装包和冒烟测试是两个关键环节。随着项目规模的扩大和测试需求的增加&#xff0c;传统的手动操作方式已经无法满足效率和质量的要求。通过AirtestIDE企业版与DeviceKeeper结合的批量装包和冒烟测试解决方案&#xff0c;可以提…

【科研新手】如何判断自己找到的创新点是否已被发表呢?

很多人在自己的实验结果出来后再开始写论文&#xff0c;才发现自己的论文创新点已经被他人抢先发表了&#xff0c;因此我们需要做好预防措施&#xff0c;那么如何判断自己所找到的创新点是否已被发表了呢。 1、在纬度学术检索最新的文献并下载 2、将文献投喂到Kimi智能助手&am…

IOS逆向助手-无需越狱就能逆向IOS软件的强大工具

前言 晓杰自己就是JAVA开发程序员&#xff0c;工作之余也会学习下逆向&#xff0c;研究一下各个软件的漏洞用于提交漏洞赚取微薄的漏洞奖励来补贴家用&#xff0c;下面晓杰就将自用的IOS逆向助手分享给大家&#xff01; 软件简介 IOS逆向助手支持越狱和未越狱设备安装&#…

储能电池仓电池热失控监测系统技术分析

在当今能源转型的大背景下&#xff0c;储能技术的发展至关重要。而储能电池仓作为储能系统的核心组成部分&#xff0c;其安全性问题备受关注。电池热失控是储能电池仓面临的重大风险之一&#xff0c;一旦电池发生热失控&#xff0c;可能引发火灾、爆炸等严重后果。为了有效防范…

2024洗衣机选择(个人笔录)

总结 比较 说明&#xff1a;素材引自小红书博主郎朗Waves

【ceph学习】S3权限认证部分

认证过程简介 认证的过程是一个对用户信息进行解析并且判断前后得到的秘钥是否一致的过程。 auth_regitry的创建 在rgw_main.cc:main()中进行初始化auth_registry对象 /*rgw_main.cc*/ /* Initialize the registry of auth strategies which will coordinate * the dynamic…