洛谷P5648


洛谷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+1nxt[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 SKADIios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#endifint 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.rhkb.cn/news/443426.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何让你的Mac右键菜单栏更加的丰富多样

Mac电脑的右键菜单栏不如Windows的丰富&#xff0c;虽然可以在系统设置一些常用功能&#xff0c;但是种类不够丰富&#xff0c;这对于一些用惯了Windows的人来说可以说是非常的不习惯&#xff0c;不管是工作使用还是日常使用来说都有一些影响&#xff0c;如何才能让Mac的右键菜…

Vite + Vue3 使用 cdn 引入依赖,并且把外部 css、js 文件内联引入

安装插件 pnpm i element-plus echarts axios lodash -S在 vite.config.js 引用 注意事项&#xff1a;element-plus 不能在 vite.config.js 中使用按需加载&#xff0c;需要在 main.js 中全局引入&#xff1b; import { resolve } from path import { defineConfig } from v…

跟李沐学AI:使用注意力机制的seq2seq

动机 机器翻译中&#xff0c;每个生成的单词可能相关于源句子中的不同词。但Seq2sqe模型不能对此直接建模。 简单的Seq2Seq模型存在一个问题&#xff0c;即它将整个输入序列的信息压缩到了一个固定长度的向量中&#xff0c;这可能导致信息丢失&#xff0c;尤其是当输入序列很…

linux自用小手册

一、GDB常用命令 想用gdb调试C或C程序&#xff0c;编译时需要加-g选项&#xff0c;编译出的文件为debug状态&#xff08;如果不加则是release状态&#xff09;&#xff0c;且不可以加-O选项进行优化。 命令简写解释set args 设置程序传递的参数 例&#xff1a;./demo -v value…

PCL 计算点云OBB包围盒(PCA)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 计算协方差矩阵和质心 2.1.2 计算特征值和特征向量 2.1.3 构建包围盒并可视化 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与…

Renesas R7FA8D1BH (Cortex®-M85)的PWM控制小车

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 硬件架构 2.1 硬件框架结构 2.2 小车控制原理 3 软件功能实现 3.1 FSP配置参数 3.2 代码实现 3.3 源代码文件 源代码下载地址&#xff1a; https://www.firebbs.cn/forum.php?modviewthre…

社工字典生成工具 —— CeWL 使用手册

GitHub - digininja/CeWL: CeWL is a Custom Word List GeneratorCeWL is a Custom Word List Generator. Contribute to digininja/CeWL development by creating an account on GitHub.https://github.com/digininja/CeWL/ 0x01&#xff1a;CeWL 简介 CeWL&#xff08;Cust…

MySQL 联合索引底层存储结构及索引查找过程解读

前言 大家好&#xff0c;我是 Lorin &#xff0c;联合索引&#xff08;Composite Index&#xff09;又称复合索引&#xff0c;它包括两个或更多列。与单列索引不同&#xff0c;联合索引可以覆盖多个列&#xff0c;这有助于加速复杂查询和过滤条件的检索。联合索引的列顺序非常…

从零开始学cv-17:图像绘制基本图形

文章目录 前言一、绘制直线与箭头二、绘制矩形三、绘制圆形椭圆形 前言 随着计算机视觉技术的不断发展&#xff0c;OpenCV作为一款强大的开源图像处理库&#xff0c;受到了越来越多开发者的喜爱。本文将带领读者走进OpenCV的世界&#xff0c;从基础入手&#xff0c;详细介绍如…

冷热数据分离

优质博文&#xff1a;IT-BLOG-CN 一、背景 随着机票业务的快速发展&#xff0c;订单量持续增长对业务性能带来影响&#xff0c;需要进行冷热数据分离。目前机票订单模块主要使用Mysql(InnoDB)作为数据库存储&#xff0c;历史订单信息状态修改频率低并占用大量数据库存储空间&…

腾讯IM SDK:TUIKit发送多张图片

一、问题描述 在使用腾讯IM DEMO&#xff08;https://github.com/TencentCloud/chat-uikit-vue.git&#xff09;时发现其只支持发送一张图片&#xff1a; 二、解决方案 // src\TUIKit\components\TUIChat\message-input-toolbar\image-upload\index.vue<inputref"inp…

AcWing 802. 区间和(离散化算法,python)

本篇博客详细讲解一下离散化知识点&#xff0c;通过讲解和详细列题带大家掌握离散化。 题目&#xff1a; 原题链接&#xff1a;https://www.acwing.com/problem/content/description/804/ 假定有一个无限长的数轴&#xff0c;数轴上每个坐标上的数都是 0。 现在&#xff0c;…

记一次pyc逆向

.py文件   源代码文件。   这是开发者编写的 Python 源代码文件&#xff0c;包含了可执行的 Python 代码。 .pyc文件   字节码文件。   Python 源文件&#xff08;.py&#xff09;在执行时会被编译为字节码&#xff0c;并存储在 __pycache__ 目录下&#xff0c;文件名通…

PHP变量(第④篇)

本栏目教学是php零基础到精通&#xff0c;如果你还没有安装php开发工具请查看下方链接&#xff1a; Vscode、小皮面板安装-CSDN博客 今天来讲一讲php中的变量&#xff0c;变量是用于存储信息的"容器"&#xff0c;这些数据可以在程序执行期间被修改&#xff08;即其…

解决Nginx出现“Too many open files”的问题

解决Nginx出现“Too many open files”的问题 在那个不经意的瞬间&#xff0c;我感到一阵莫名的恍惚。同事突然提出要看我的手机&#xff0c;她的目光落在了我那泛黄的手机壳上。出乎意料地&#xff0c;她开始细心地擦拭&#xff0c;从内到外&#xff0c;动作轻柔而专注。那一刻…

Linux——磁盘分区、挂载

Linux 分区 原理介绍 原理图如下 当我们在/home目录下新建一个文件a.txt时&#xff0c;该文件实际上是存放在硬盘B的分区1中的&#xff0c;这就是图里说的&#xff0c;当进入某个目录&#xff0c;可以进入到该目录下挂载的分区里的意思 硬盘说明 应用实例&#xff1a;挂载一个…

【Flask】Flask数据库

【Flask】Flask数据库 1.概述2.使用Flask-SQLAlchemy管理数据库3.定义模型4.关系5.数据库操作创建表插入行修改行删除行查询行 1.概述 大多数的数据库引擎都有对应的 Python 包&#xff0c;包括开源包和商业包。Flask 并不限制你使用何种类型的数据库包&#xff0c;因此可以根…

PhotoMaker部署文档

一、介绍 PhotoMaker&#xff1a;一种高效的、个性化的文本转图像生成方法&#xff0c;能通过堆叠 ID 嵌入自定义逼真的人类照片。相当于把一张人的照片特征提取出来&#xff0c;然后可以生成你想要的不同风格照片&#xff0c;如写真等等。 主要特点&#xff1a; 在几秒钟内…

前端登录页面验证码

首先&#xff0c;在el-form-item里有两个div&#xff0c;各占一半&#xff0c;左边填验证码&#xff0c;右边生成验证码 <el-form-item prop"code"><div style"display: flex " prop"code"><el-input placeholder"请输入验证…

小赢卡贷公益行:乡村振兴与多元公益并进

在金融科技的浪潮中&#xff0c;小赢卡贷不仅以其创新的金融产品和服务赢得了市场的广泛认可&#xff0c;更以其背后的公益之心&#xff0c;积极履行社会责任&#xff0c;传递着温暖与希望。小赢公益基金会&#xff0c;作为小赢卡贷社会责任的延伸&#xff0c;主要聚焦于乡村振…