[蓝桥杯 2021 国 ABC] 123(java)——前缀和,思维

目录

题目

解析

代码


这么久了,我终于能不看别人代码完整写出来了,呜呜呜。虽然过程也是很曲折。

题目

解析

这个题,找其中数列的规律,1,1,2,1,2,3,1,2,3,4,...,因此我们把拆分成行列,如下

1

1 2

1 2 3

1 2 3 4

1 2 3 4 5

....

        在这种格式下,我们可以发现每行的行数就是这行的最后一个数的值,且这行的和等于整个数列的值的个数。(例如:第3行最后一个值为3,第三行的和为6,对应从第一行到第三行的值的个数,也为6)

        因此,我们求解[l,r] 之间的值,我们可以找到 l 和 r 对应的行数,假设为 l\_{row}r\_{row} ,我们只需要加上 从 l\_{row}r\_{row} 每行的值,在处理一下  l\_{row}r\_{row} 行端点的多的或者少的值,即可求出。

        因此,我们可以预处理每行的和,用 a[ ] 存储起来,以及前 i 行的和,用 s[ ] 存储起来

        对于行数的查找,我们可以使用二分,因为 第 i 行的和等于整个数列的值的个数,因此我们使用二分,每次判断 l 与 a[mid] 的大小,找到 l 对应的行 l\_{row} 以及 r 对应的行 r\_{row}利用 s[r\_row]-s[l\_row] 可以求出行之间的和.

        然后再对第 l\_{row} 或者 l\_{row}+1 行没计算的值进行处理(这里要对 l\_{row}+1 进行处理的原因,我写的代码中二分找到是 ,比如,l 在第 i 行,但是如果 l 不是该行的最后一个数,取 i-1 行,即二分返回 i-1,所以需要解决 l\_{row}+1 的值)。r\_{row} 同理。

对于l:

  • l != a[l\_row]sum+=a[l-a[l\_row]-1]。l 不是  l\_{row} 的最后一个数,即 l 是 l\_{row}+1 行的数。(其中,l 也不能是 l\_{row}+1 的第一个数)
  • l == a[l\_row]sum += l\_row ,加上 l 位置上的值。

r同理 

      (这部分自己动手画一下即可理解)

代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class P8762 {
    static int N = 1500000; //因为l,r的范围是10^12,当行数为1500000,数列总的个数可以超过10^12
    static int t;
    static long[] a = new long[N]; // 存储每行的和
    static long[] s = new long[N]; // 存储前i行的和
    public static void main(String[] args) throws IOException{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        t = Integer.parseInt(in.readLine());
        // 预处理 a[] 和 s[]
        for(int i=1;i<N;i++){
            a[i] += a[i-1]+i;
            s[i] += s[i-1]+a[i];
        }

        while (t-->0){
            String[] str = in.readLine().split(" ");
            long l = Long.parseLong(str[0]);
            long r = Long.parseLong(str[1]);
            // 找l和r对应的行
            int l_down = find(l);
            int r_down = find(r);
            // 利用s[] 计算两个行之间的值
            long sum = s[r_down] - s[l_down];
            // 如果l对应的是l_down行的最后一个,直接加上位于l位置的值,否则,就要减l_down+1行多加了的值
            if(l==a[l_down]) sum += l_down;
            else if(l-a[l_down]>1) sum -= a[(int) (l-a[l_down]-1)];
            // 如果r对应的不是r_down的最后一个,就要加上r_down+1行未加上的值;否则,不用管,已经计算了
            if(r!=a[r_down]) sum += a[(int) (r-a[r_down])];
            System.out.println(sum);
        }
    }
    // 二分找对应的行
    public static int find(long x){
        int l = 1,r = N;
        while (l<r){
            int mid = (l+r+1)/2;
            if(a[mid]<=x) l = mid;
            else r = mid-1;
        }
        return l;
    }
}

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

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

相关文章

Java并发处理

Java并发处理 问题描述:项目中业务编号出现重复编号 生成编号规则&#xff1a;获取数据库表最大值&#xff0c;然后再做1处理&#xff0c;即为新编号&#xff08;因为起始值是不固定的&#xff0c;还存在‘字符数据’格式&#xff0c;做了字典项可配置&#xff0c;所以不能直…

Ai 一键美术绘画文章,蓝海项目,流量巨大,盈利成效显著

今天我要向大家介绍一个全新的蓝海项目&#xff0c;那就是AI一键美术绘画文章。这个项目打破了传统的思维模式&#xff0c;更加吸引人的眼球&#xff0c;已经在各大网站上引发了大量的关注&#xff0c;轻松在抖音上热门也变得简单易行且稳定。 下载 地 址 &#xff1a; laoa…

PopClip for Mac 激活版:让文本处理更高效

还在为繁琐的文本处理而烦恼吗&#xff1f;PopClip for Mac来帮您解决&#xff01;这款神器般的文本处理工具&#xff0c;能让您轻松应对各种文本处理任务。无论是写作、编程还是日常办公&#xff0c;PopClip for Mac都能助您一臂之力&#xff0c;让您的文本处理更高效、更便捷…

【基础绘图】 09.小提琴图

效果图&#xff1a; 主要步骤&#xff1a; 1. 数据准备&#xff1a;生成随机数组 2. 数据处理&#xff1a;计算四分位数、中位数、均值、最大最小值 3. 图像绘制&#xff1a;绘制小提琴图 详细代码&#xff1a;着急的直接拖到最后有完整代码 步骤一&#xff1a;导入库包及…

动态规划----股票买卖问题(详解)

目录 一.买卖股票的最佳时机&#xff1a; 二.买卖股票的最佳时机含冷冻期&#xff1a; 三.买卖股票的最佳时期含⼿续费&#xff1a; 四.买卖股票的最佳时机III: 五.买卖股票的最佳时机IV: 买卖股票的最佳时机问题介绍&#xff1a;动态规划买卖股票的最佳时机是一个经典的…

排序2——冒泡排序,快速排序(3种递归方式+3种非递归方式)

目录 1.交换排序 2.冒泡排序 2.1基本思路 1.1.2复杂度分析 3.快速排序 3.1基本思想 3.2Hoare版本&#xff08;最初的&#xff09; 3.2.1缺点 3.2.2优化 第一种——随机选key 第二种——三数取中 第三种——小区间优化 3.3挖坑版本&#xff08;更好理解&#xff09…

【谷粒商城】01-环境准备

1.下载和安装VirtualBox 地址&#xff1a;https://www.virtualbox.org/wiki/Downloads 傻瓜式安装VirtualBox 2.下载和安装Vagrant官方镜像 地址&#xff1a;https://app.vagrantup.com/boxes/search 傻瓜式安装 验证是否安装成功 打开CMD,输入vagrant命令&#xff0c;是否…

pyqt5将ui文件转为python文件

在pyqt5中使用 pyuic将ui文件转为py文件&#xff1a; 例如&#xff1a;将home.ui文件转为vio_detect.py文件&#xff0c;所需命令如下&#xff1a; pyuic5 -x home.ui -o vio_detect.py

【Linux】基于 Jenkins+shell 实现更新服务所需文件 -->两种方式:ssh/Ansible

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

STL-Hashtable

hashtable hashtable是通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系&#xff0c;这样在查找的时候就可以很快的找到该元素。 哈希函数 哈希函数的定义域必须包括需要存储的全部关键码&#xff0c;而如果散列表允许有m个地址时&#xff0c…

C++内存管理(1)

目录 1.new用法说明 2.new/delete在栈里面的运用 3.operator new/operator delete函数 4.构造函数的显式调用 5.malloc&&new&&free&&delete区别 1.new用法说明 &#xff08;1&#xff09;在C语言阶段&#xff0c;我们无论是为数组开辟空间&#x…

瀚高数据库(HighGoDB)Windows安装使用

1.下载 2.安装 瀚高数据库下载与安装&#xff08;Windows版&#xff09;-CSDN博客 3.连接工具 4.建库、建表操作 瀚高数据库管理工具-CSDN博客 *报错Cant access non-default database&#xff0c;需要右键数据库-设为活动对象 5.导入外部数据&#xff08;迁移、对比&…

云贝教育 |【好课上新】ITSS服务工程师与服务经理认证培训

课程前言 ITSS是中国电子技术标准化研究院推出的&#xff0c;包含“IT 服务工程师”和“IT 服务经理”的系列培训。有效满足GB/T 28827.1 的符合性评估要求和ITSS服务资质升级要求。 IT 服务工程师”结合 IT服务从业人员能力规范和要求&#xff0c;从服务技术、服务技巧和服务…

Linux环境下parted工具使用

在工作中&#xff0c;我们经常会遇到大于分区大于2T的磁盘&#xff0c;由于系统盘最大不能超2T&#xff0c;我们会在做raid时将划分VD来进行装系统&#xff0c;但系统自动安装后无法将磁盘全部识别出来&#xff0c;管理员有时会要求手动对分区进行挂载&#xff0c;这个文档介绍…

基于PSO粒子群优化的PV光伏发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 粒子群优化算法基础 4.2 PV系统及其最大功率点跟踪 4.3 PSO在PV MPPT中的应用 5.完整工程文件 1.课题概述 基于PSO粒子群优化的PV光伏发电系统simulink建模与仿真。通过PSO粒子群优化进行最大功率…

Day25 代码随想录打卡|栈与队列篇---用队列实现栈

题目&#xff08;leecode T225&#xff09;&#xff1a; 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将…

每日OJ题_贪心算法四④_力扣397. 整数替换

目录 力扣397. 整数替换 解析代码 力扣397. 整数替换 397. 整数替换 难度 中等 给定一个正整数 n &#xff0c;你可以做如下操作&#xff1a; 如果 n 是偶数&#xff0c;则用 n / 2替换 n 。如果 n 是奇数&#xff0c;则可以用 n 1或n - 1替换 n 。 返回 n 变为 1 所需…

C# Linq中的自定义排序

1.开发过程中&#xff0c;会遇到OrderBy/OrderByDescending排序无法满足的情况&#xff0c;此时就需要自定义排序&#xff0c;按照想要的排序规则取排序&#xff0c;比如订单的状态等等。 2.自定义泛型比较器代码如下&#xff1a; /// <summary>/// 自定义泛型比较器(用…

【ArcGIS 小技巧脚本工具】批量修复CAD图层的数据源

当你打开ArcPro文档的时候&#xff0c;看到内容列表满屏红色感叹号。 新手可能会心脏骤停&#xff0c;久经沙场的规划人只会微微一笑。随机选中一个幸运的红色感叹号点击&#xff0c;打开更改数据源对话框&#xff0c;找到它原始的数据源&#xff0c;确定。 but。。。为啥只修复…

将CentOS 7安装在U盘上,这时你将体验到......

文章目录 前言一、Linux 是什么&#xff1f;二、使用步骤1.下载安装 VMware Workstation Pro2.下载 CentOS 镜像3.准备一个U盘&#xff08;最好是32G以上的&#xff09;4.VMware 里安装 CentOS 总结 前言 随着 Linux 在服务器、嵌入式系统、移动设备等领域的广泛应用&#xff…