当前位置: 首页 > news >正文

蓝桥杯题型

蓝桥杯题型分类

二分

123

传送门

在这里插入图片描述
在这里插入图片描述

1. 小区间的构成

假设数列的构成是如下形式:

  • 第 1 个区间包含 1 个元素(1)。
  • 第 2 个区间包含 2 个元素(1 2)。
  • 第 3 个区间包含 3 个元素(1 2 3)。
  • 第 4 个区间包含 4 个元素(1 2 3 4)。

i 个小区间包含 i 个元素。我们将这些小区间连起来形成整个数列。

2. 数组 a[j] 的定义

数组 a[j] 表示前 j 个小区间的总元素数,同时也能表示每个小区间的和。例如:

  • a[1] = 1 (表示前 1 个小区间有 1 个元素)
  • a[2] = 1 + 2 = 3 (表示前 2 个小区间共有 3 个元素)
  • a[3] = 1 + 2 + 3 = 6 (表示前 3 个小区间共有 6 个元素)
  • a[4] = 1 + 2 + 3 + 4 = 10 (表示前 4 个小区间共有 10 个元素)

注意,数组 a[j] 是单调递增的,因为每个小区间的元素个数都在增加。

关键点:k = i - a[j]

  • 数列中的位置 i 是在第 j+1 个区间中的某个元素。
  • j 个区间包含了 a[j] 个元素,也就是说,第 j+1 个区间的第一个元素出现在位置 a[j] + 1

因此,位置 i 在第 j+1 个区间的具体位置是:

  • j+1 个区间的第 k 个元素k 就是位置 i 相对于第 j+1 个区间开始位置的偏移量。

由于前 j 个区间包含了 a[j] 个元素,第 j+1 个区间从位置 a[j] + 1 开始。所以位置 i 在第 j+1 个区间中的具体位置是:

k = i - a[j]

#include <iostream>
using namespace std;
using ll=long long;
const int N=1414215;

ll a[N],s[N];

ll persum(ll i)
{
    ll l=0,r=N;
    while(l<r)
    {
        ll mid=(l+r+1)>>1;
        if(a[mid]<i)l=mid;
        else r=mid-1;
    }
    return  s[l]+a[i-a[l]];
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    for(int i=1;i<N;i++)
    {
        a[i]=a[i-1]+i;
        s[i]=s[i-1]+a[i];
    }
    int t;
    cin>>t;
    while(t--)
    {
        ll l,r;
        cin>>l>>r;
        cout<<persum(r)-persum(l-1)<<endl;
    }
    return 0;
}

相关文章:

  • CAP三进二、Base原理和Raft算法
  • PDF 文件中的文本链接是如何定义的?
  • 简记_硬件系统设计之需求分析要点
  • 2025牛客寒假算法基础集训营6
  • Python自动化测试教程
  • Spring Boot 内置工具类,功能齐全!!
  • TTP/HTTPS、TCP/IP 协议、RPC、Socket 通信机制
  • 盛铂科技PDROUxxxx系列锁相介质振荡器(点频源):高精度信号源
  • GitLab常用操作
  • Java高频面试之集合-04
  • Nginx 开启Baise认证
  • 计算机二级MS之PPT
  • 数据库系统概论(一)详细介绍数据库与基本概念
  • 微服务概览与治理
  • 零售交易流程相关知识(top-down拆解)
  • 同步 Fork 仓库的命令
  • 公开笔记:自然语言处理(NLP)中文文本预处理主流方法
  • 软考高级信息系统项目管理师笔记-第12章项目质量管理
  • 【Manus资料合集】激活码内测渠道+《Manus Al:Agent应用的ChatGPT时刻》(附资源)
  • 布隆过滤器原理详解:高效解决大规模数据去重与查询问题
  • 制作壁纸的软件/首页优化公司
  • 国土分局网站建设方案/中国十大流量网站
  • 淮安网站开发/如何做优化排名
  • 25个网站/seo站长工具
  • wordpress 添加https/优化排名推广教程网站
  • 柳州专业网站推广公司/免费建站网站大全