洛谷P5648

news2024/11/28 7:45:27

洛谷P5648


这题花了很长时间,是在线段树题单里找到的( )。有线段树做法,但是我感觉可能比倍增做法更难看懂。以后有空再看看吧。感觉线段树现在只会板子题,绿稍微难点可能就不会。

花了很久时间之后,就觉得自己有必要去发一篇博客来纪念一下,毕竟花了这么久的时间。中午看的时候,突然发现线段树我不知道怎么弄……然后只能看题解了,感觉看着都很麻烦的,我真的感觉自己很难看懂题解,有主席树和线段树做法,但是我有点不太懂,倍增也有点不懂。

然后晚上,让 chat 给我解释了一下,就看得差不多了。其实大佬写的题解很好,只是我有些变量其实没看懂干啥用的,没仔细看吧,但是幸好现在已经解决了。后来交的时候一直 RE , WA ,改了几个东西之后过了,现在也想明白原因了。

题目大意

给你一个数组 a a a , 给出 q q q 次询问 ,每次给出 l , r l,r l,r ,求下列式子的和。
∑ i = l r max ⁡ l ≤ j ≤ i a j \sum_{i=l}^{r} \max_{l\le j\le i}a_j i=lrljimaxaj

如果 l l l 确定,那么 a l a_l al 一定会被一直加直到下一个最大值出现或者 i > r i>r i>r , 所以相当于我们一个数字在它和它的下一个最大值出现之前,一直会被加。所以我们可以预处理出每一个 a i a_i ai的下一个比它大的数字,这样做只能拿 90 90 90 分看讨论区说。如果遇到一直递增的数据,复杂度就很高。

可以使用倍增 , n x t i , j nxt_{i,j} nxti,j 表示从第 i i i 个点跳转到的下一个点,这里跳转指的其实就是它后面的第多少个新的最大值。用 f i , j f_{i,j} fi,j 表示 i i i 跳转 2 j 2^j 2j 个点的答案。

然后就有

n x t i , j = n x t n x t i , j − 1 , j − 1 nxt_{i,j}=nxt_{nxt_{i,j-1},j-1} nxti,j=nxtnxti,j1,j1

f i , j = f i , j − 1 + f n x t i , j − 1 , j − 1 f_{i,j}=f_{i,j-1}+f_{nxt_{i,j-1},j-1} fi,j=fi,j1+fnxti,j1,j1

第一个式子是显然的,但第二个式子我想了很久,虽然确实很简单,当时我没太理解 n x t nxt nxt 数组吧,其实就是只会跳转到比它大的数字,所以后面那部分的答案就不用再考虑前面的部分。线段树做法貌似也是这样的思路,以后看看。

//created: 2024-10-08 20:27:01
// #define SKADI
#if defined(YUANSHEN)
#include<D:/Tovi/template/my_template.hpp>
#else
#include<bits/stdc++.h>
using namespace std;
#endif
#ifndef SKADI
#define dbg(...) 42
#endif
template <typename T1, typename T2> void cmin(T1 &x, const T2 &y) {
x = x < y ? x : y;
}
template <typename T1, typename T2> void cmax(T1 &x, const T2 &y) {
x = x > y ? x : y;
}
using ll = long long;
using ull = unsigned long long;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
#define fixset(x) fixed<<setprecision(x)
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define all(x) (x).begin(),(x).end()
#define ALL(x) (x).begin()+1,(x).end()
const int INF = 1000000000;
const ll LNF = 1000000000000000000;

const int N = 5e5+10;
ll f[N][22];
int n,a[N],nxt[N][22];

void init()
{
    vector<int>stk;
    //nxt[i][0]找到的是右边第一个比a[i]大的数字的下标,用单调栈就行
    for(int i=1;i<=n;i++){
        while(!stk.empty()&&a[stk.back()]<a[i]){
            nxt[stk.back()][0]=i;
            stk.pop_back();
        }
        stk.push_back(i);
    }
    while(!stk.empty()){
        nxt[stk.back()][0]=n+1;
        stk.pop_back();
    }//剩下的说明没有数字比它大 所以就弄成n+1,而且能确保所有点都被初始化
    nxt[n+1][0]=n+1;//这个一定要,后面会用到的
    for(int i=1;i<=n;i++){
        f[i][0]=1LL*a[i]*(nxt[i][0]-i);
    }//很显然,这一部分的和就等于a[i]直接乘以a[i]是最大值的区间长度
    
    for(int i=1;i<=21;i++){
        for(int j=1;j<=n+1;j++)//边界一定要n+1
            nxt[j][i]=n+1;
        for(int j=1;j+(1<<i)<=n+1;j++){
            //因为这里更新的话,如果你前面这个nxt已经是最大的话,那么这里nxt[n+1][]会没有,如果不初始化
            nxt[j][i]=nxt[nxt[j][i-1]][i-1];
            f[j][i]=f[j][i-1]+f[nxt[j][i-1]][i-1];
        }
    }
}
void solve()
{
    int q;
    cin>>n>>q;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    init();
    ll lst=0;//这里也开 ll ,有可能超的,而且小心异或边负数了
    while(q--){
        ll l,r;//注意开ll , 看讨论区有人说可能爆int 
        cin>>l>>r;
        l=1+(l^lst)%n;
        r=(r^(lst+1))%(n-l+1)+l;
        ll cur=0,pos=l;
        for(int i=21;i>=0;i--){
            if(nxt[pos][i]>r) continue;
            cur+=f[pos][i];
            pos=nxt[pos][i];
        }
        cur+=1LL*a[pos]*(r-pos+1);//注意别爆了
        lst=cur;
        cout<<lst<<'\n';
    }
}

int main()
{
#ifndef SKADI
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
#endif
    int T=1;
    // cin>>T;
    while(T--)
        solve();
    return 0;
}

感觉这题对我真挺有难度的,感谢各位大佬的题解。我本来半天没找到自己哪写错了,刚开始一直 R E RE RE,然后 W A WA WA ,都是样例能过但分数 0 0 0,等等,为啥 R E RE RE来着,好像又想不明白了来着。

O K OK OK ,找到了, R E RE RE 是因为没开 l l ll ll 然后异或成负数了然后下标为负了就寄了吧,这数据挺好的哈,全部 R E RE RE 。洛谷的讨论区真是个好东西,感谢各位大佬。然后 W A WA WA 是因为初始话没有初始化 n x t n + 1 , i nxt_{n+1,i} nxtn+1,i导致很多 n x t nxt nxt 变成 0 0 0 了。这个很久很久才看出来,还是我突然才想起来得对拍一下才发现的。

然后后来我改了那个对了,然后又感觉自己改了很多东西,或者没改啥,就想对比一下差异,但是没找到啥好的插件, C F CF CF 里的 c o m p a r e compare compare 也是确实挺不错的哈。

今天还算是可以的,虽然感觉还是没写什么,但是还是写了的,明天继续吧,至少今天不用愧疚了~

写这个花了挺久,一小时吧差不多,但是值得吧。发现我 t y p o r a typora typora 其实没有打开那个支持 l a t e x latex latex 的设置,然后现在看着爽多了,然后也在设置里发现,可以自动把添加的图片的路径复制到指定目录。挺不错的。

睡觉了等下,然后看看博客效果,以后多刷绿题!!!现在 42 42 42 ,然后感觉这个 h e x o hexo hexo 博客 l a t e x latex latex 显示效果不是很好,以后考虑换个主题。

老师调课了,明天不用早八,很爽。
create: 2024-10-09 00:15:07

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

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

相关文章

打造直播美颜平台的关键技术:视频美颜SDK的深度解析

本篇文章&#xff0c;小编将深入解析视频美颜SDK的关键技术&#xff0c;探讨其在打造直播美颜平台中的作用。 一、视频美颜SDK的定义与功能 视频美颜SDK是一套专门为实时视频处理而设计的软件开发工具包。其主要功能包括人脸检测、肤色美化、瑕疵修复、虚化背景、实时滤镜等。…

Python对PDF文件的合并操作

在处理 PDF 文件时&#xff0c;合并多个 PDF 文件为一个单一文件或者将某个单一文件插入某个PDF文件是一个常见的需求。Python 提供了多种库来实现这一功能&#xff0c;其中 PyPDF2 是一个非常流行的选择。该库提供了简单易用的接口&#xff0c;包括 merge() 方法&#xff0c;可…

CRE6281B1 (宽VCC:8-45V PWM电源芯片)

CRE6281B1 是一款外驱功率管的高度集成的电流型PWM 控制 IC&#xff0c;为高性能、低待机功率、低成本、高效率的隔离型反激式开关电源控制器。在满载时&#xff0c;CRE6281B1工作在固定频率(65kHz)模式。在负载较低时&#xff0c;采用节能模式&#xff0c;实现较高的功率转换效…

关于Allegro导出Gerber时的槽孔问题

注意点一&#xff1a; 如果设计的板子中有 槽孔和通孔(俗称圆孔)&#xff0c;不仅要NC Drill, 还要 NC Route allegro导出的槽孔文件后缀是 .rou 圆型孔后缀 是 .drl &#xff0c;出gerber时需要看下是否有该文件。 注意点二&#xff1a; 导出钻孔文件时&#xff0c;设置参…

Hi3061M开发板——系统时钟频率

这里写目录标题 前言MCU时钟介绍PLLCRG_ConfigPLL时钟配置另附完整系统时钟结构图 前言 Hi3061M使用过程中&#xff0c;AD和APT输出&#xff0c;都需要考虑到时钟频率&#xff0c;特别是APT&#xff0c;关系到PWM的输出频率。于是就研究了下相关的时钟。 MCU时钟介绍 MCU共有…

22.1 K8S之KubeSphere实现中间件高可用集群

22.1 K8S之KubeSphere实现中间件高可用集群 一. 章节概述二. WordPress1. WordPress 简介---------------------------------------------------------------------------------------------------一. 章节概述 二. WordPress 1. WordPress 简介 创建并部署 WordPress

MySQL 数据库的性能优化方法方法有哪些?

MySQL 数据库的性能优化方法方法有哪些&#xff1f; 从开发角度来看&#xff0c;一般可以从 SQL 和库表设计两部分优化性能。 SQL 优化 根据慢sql日志&#xff0c;找出需要优化的一些sql语句。 常见优化方向&#xff1a; 避免select *&#xff0c;只查询必要的字段&#x…

62 加密算法

62 加密算法 三种加密算法分类&#xff1a; 对称加密&#xff1a;密钥只有一个&#xff0c;解密、解密都是这个密码&#xff0c;加解密速度快&#xff0c;典型的对称加密有DES、AES、RC4等非对称加密&#xff1a;密钥成对出现&#xff0c;分别为公钥和私钥&#xff0c;从公钥…

sass学习笔记(1.0)

1.使用变量 sass可以像声明变量那样进行使用&#xff0c;这样同样的样式&#xff0c;就可以使用相同的变量来提高复用。 语法为&#xff1a;$ 变量名 在界面中也可以正常的显示 当然了&#xff0c;变量之间也可以相互引用&#xff0c;比如下面 div{$_color: #d45387;$BgColo…

kibana 删除es指定数据,不是删除索引

1 查询条件查询出满足条件的数据 GET /order_header_idx_202410/_search {"from":0,"size":10,"query":{"bool":{"filter":[{"term":{"oh_tenantId":{"value":"0211000001",&…

NeuVector部署、使用与原理分析

文章目录 前言1、概述2、安装与使用2.1、安装方法2.1.1、部署NeuVector前的准备工作2.1.1.1 扩容系统交换空间2.1.1.2 Kubernetes单机部署2.1.1.2.1 部署Docker2.1.1.2.2 部署Kubectl2.1.1.2.3 部署Minikube 2.1.1.3 Helm部署 2.1.2、使用Helm部署NeuVector 2.2、使用方法2.2.1…

YOLOv5改进——添加SimAM注意力机制

目录 一、SimAM注意力机制核心代码 二、修改common.py 三、修改yolo.py ​三、建立yaml文件 四、验证 一、SimAM注意力机制核心代码 在models文件夹下新建modules文件夹&#xff0c;在modules文件夹下新建一个py文件。这里为simam.py。复制以下代码到文件里面。 import…

Mysql中创建用户并设置任何主机连接

Mysql中创建用户并设置任何主机连接 文章目录 Mysql中创建用户并设置任何主机连接背景解决方式 背景 在linux上安装mysql,默认用户是root,但是用navicat连接不了,必须要用ssh隧道连接,现在想用任何主机只要输入账号密码之后就可以连接 解决方式 #创建一个指定用户和IP链接的用…

Java:数据结构-ArrayList和顺序表(2)

一 ArrayList的使用 1.ArrayList的构造方法 第一种&#xff08;指定容量的构造方法&#xff09; 创建一个空的ArrayList&#xff0c;指定容量为initialCapacity。 public ArrayList(int initialCapacity) {if (initialCapacity > 0) {this.elementData new Object[init…

鸿蒙微内核IPC数据结构

鸿蒙内核IPC数据结构 内核为任务之间的通信提供了多种机制&#xff0c;包含队列、事件、互斥锁、信号量等&#xff0c;其中还有Futex(用户态快速锁)&#xff0c;rwLock(读写锁)&#xff0c;signal(信号)。 队列 队列又称为消息队列&#xff0c;是一种常用于任务间通信的数据…

《ASP.NET Web Forms 实现短视频点赞功能的完整示例》

在现代Web开发中&#xff0c;实现一个动态的点赞功能是非常常见的需求。本文将详细介绍如何在ASP.NET Web Forms中实现一个视频点赞功能&#xff0c;包括前端页面的展示和后端的处理逻辑。我们将确保点赞数量能够实时更新&#xff0c;而无需刷新整个页面。 技术栈 ASP.NET We…

Java进阶之路—单元测试Juint(完整详解Juint使用以及Juin注解,附有代码+案例)

文章目录 单元测试Juint35.1 概述35.2 用法手动导包正确的使用方式 35.3 Junit常用注解 单元测试Juint 35.1 概述 针对最小功能单元编写测试代码&#xff0c;Java中最小功能单元是方法&#xff0c;因此单元测试就是针对Java方法的测试。 对部分代码进行测试。 35.2 用法 &…

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的新能源停车场管理系统

开题报告 随着新能源汽车的快速普及和普及&#xff0c;新能源车辆的停车和充电需求也越来越大。传统的停车场管理系统无法满足这些新能源车辆的特殊需求&#xff0c;如充电桩分配、充电桩使用情况的实时监测等。因此&#xff0c;开发一种基于 Java 的新能源停车场管理系统成为…

计算机视觉之YOLO算法基本原理和应用场景

YOLO算法基本原理 整体流程 YOLO 将目标检测问题转化为一个回归问题。它将输入图像划分成多个网格单元&#xff0c;每个网格单元负责预测中心点落在该网格内的目标。对于每个网格单元&#xff0c;YOLO 预测多个边界框以及这些边界框中包含目标的类别概率。边界框通常由中心点坐…

Spring Cloud Stream 3.x+kafka 3.8整合

Spring Cloud Stream 3.xkafka 3.8整合&#xff0c;文末有完整项目链接 前言一、如何看官方文档(有深入了解需求的人)二、kafka的安装tar包安装docker安装 三、代码中集成创建一个测试topic&#xff1a;testproducer代码producer配置&#xff08;配置的格式&#xff0c;上篇文章…