洛谷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.mzph.cn/bicheng/55905.shtml

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

相关文章

【YOLO学习】YOLOv5口罩检测实战

文章目录 1. 环境配置2. 下载代码3. 安装库3.1 安装pytorch3.2 安装其他库 4. 测试5. 数据标注6. 模型训练6.1 一些修改6.2 训练 7. 界面可视化 1. 环境配置 1. 先参考其他文章安装 Anaconda 或者 Miniconda&#xff0c;我安装的是 Miniconda。 2. 更换国内源&#xff0c;以加快…

LLM详解

一 定义 Large Language Model&#xff0c;称大规模语言模型或者大型语言模型&#xff0c;是一种基于大量数据训练的统计语言模型&#xff0c;可用于生成和翻译文本和其他内容&#xff0c;以及执行其他自然语言处理任务&#xff08;NLP&#xff09;&#xff0c;通常基于深度神…

vue 的属性绑定

双大括号不能在 HTML attributes 中使用。想要响应式地绑定一个 attribute&#xff0c;应该使用 v-bind 指令。 <template> <div v-bind:class"boxClass" v-bind:id"boxId"> </div> </template><script> export default{da…

VNC轻松连接远程Linux桌面

Linux配置VNC&#xff08;以RedHat、CentOS为例&#xff09; 说明&#xff1a; Linux平台安装VNCServer Windows平台使用VNC-Viewer 1.在Linux平台安装VNCServer服务端软件包。 yum -y install vnc *vnc-server*2.修改VNCServer主配置文件 vi /etc/sysconfig/vncservers复制…

【Redis】Set类型的常用命令与应用场景

目录 1.命令小结 2.命令解析 3.编码方式与应用场景 1.命令小结 &#xff08;1&#xff09;set的特点 1&#xff09;set中存放的数据也都是String类型 2&#xff09;set集合中的元素是无须的 3&#xff09;set集合中的元素是唯一的&#xff0c;不可重复 &#xff08;2&a…

RISC-V开发 linux下GCC编译自定义指令流程笔记

第一步&#xff1a;利用GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言 第二步&#xff1a;利用RSIC-V的中的.insn模板进行自定义指令的插入 第三步&#xff1a;RISC-V开发环境的搭建 C语言插入汇编 GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言语句方便了…

在树莓派上部署安装OAK

OAK设备可以与微型主机&#xff08;例如树莓派&#xff09;进行连接&#xff0c;在树莓派上安装DepthAI, 需要安装相关依赖Dependencies并且可以通过pip安装Depthai Library. DepthAI Library 在PyPi上对树莓派有预构建的 wheels 使用预配置的树莓派OS 镜像 我们提供预安装了D…

期权懂|面对期权下跌该如何操作呢?

本期让我懂 你就懂的期权懂带大家来了解&#xff0c;面对期权下跌该如何操作呢&#xff1f;有兴趣的朋友可以看一下。期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 面对期权下跌该如何操作呢&#xff1f; 首先我们需要保持冷静…

Zotero插件指南:20个工具让你的学术生活更简单

以下插件排序按照星标量进行排序&#xff0c;常用的插件大概是前20的样子&#xff0c;可以根据自己的需求进行插件的安装。 顺带提一句&#xff0c;插件不是越多越好&#xff0c;装多了可能会出现软件卡顿的情况。 1、Scholaread for Zotero 插件下载&#xff1a;插件下载 …

Linux文件权限与用户管理详解:权限、所属用户组和所有者的变更

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

HTB:Markup[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What version of Apache is running on the targets port 80? 2.What username:password combination logs in successfully? 使用Yakit并使用TOP1000字典对密码进行爆破 3.What is the word at the top of the page that accepts use…

以光塑形:光固化3D打印机原理图文解析

公众号端&#xff1a; 光固化打印机介绍https://mp.weixin.qq.com/s?__bizMzkwMjc0MTE3Mw&mid2247484073&idx1&sn0d0fd026b373b06cd7c340ec8f56a006&chksmc0a1af73f7d62665a632baebbde4e5e00ffb9c6bd31bf547b4a86855d5524535619a6175a428#rd 光固化打印机…

前端面试:项目细节重难点问题分享(17)

更多详情&#xff1a;爱米的前端小笔记&#xff08;csdn~xitujuejin~zhiHu~Baidu~小红shu&#xff09;同步更新&#xff0c;等你来看&#xff01;都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们…

SpringSession;基于Redis的SpringSession实现;实现session共享的三种方式

一&#xff0c;SpringSession简介 是SpringCloud下管理session的框架&#xff0c;在微服务架构中&#xff0c;由于应用了分布式的思想&#xff0c;session无法做到内存中互通&#xff0c;需要一个框架来实现各个微服务中session数据共享&#xff0c;SpringSession解决了这个问题…

C++语言学习(3): type 的概念

type 的概念 C中的变量拥有类型&#xff0c; 这是显然的。 实际上&#xff0c;每个 object&#xff0c; 每个 reference&#xff0c; 每个 function&#xff0c; 每个 expression &#xff0c; 都有对应的 type &#xff08;类型&#xff09;&#xff1a; Each object, refer…

随机掉落的项目足迹:使用箭头函数时踩到的坑

这篇博客没有啥硬核知识&#xff0c;讲的是我遇到问题然后排错的过程&#xff0c;大家可以当故事看看 事情的起因是请求响应的对象打印出来竟然是undefined&#xff0c;但是network里却可以正常看到响应体 于是我把这个问题扔给了我队友&#xff0c;他改了我两处代码&#xff…

通信工程学习:什么是OSPF开放式最短路径优先

OSPF&#xff1a;开放式最短路径优先 OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;被广泛应用于计算机网络中&#xff0c;特别是在构建大型和复杂的网络时。以下是对OSPF的…

Linux-磁盘优化的几个思路

优化前先看看性能指标 I/O 基准测试 fio&#xff08;Flexible I/O Tester&#xff09;正是最常用的文件系统和磁盘 I/O 性能基准测试工具。这类工具非常用&#xff0c;了解即可 应用程序优化 应用程序处于整个 I/O 栈的最上端&#xff0c;它可以通过系统调用&#xff0c;来调…

Go基础学习11-测试工具gomock和monkey的使用

文章目录 基础回顾MockMock是什么安装gomockMock使用1. 创建user.go源文件2. 使用mockgen生成对应的Mock文件3. 使用mockgen命令生成后在对应包mock下可以查看生成的mock文件4. 编写测试代码5. 运行代码并查看输出 GomonkeyGomonkey优势安装使用对函数进行monkey对结构体中方法…

UEFI学习笔记(十):系统表与ACPI表的遍历

一、概述 在 UEFI 系统表中&#xff0c;有几个关键的表用于提供系统信息、服务和硬件抽象。这些表可以通过 EFI_SYSTEM_TABLE 访问&#xff0c;常见的 UEFI 系统表如下&#xff1a; 1、EFI_SYSTEM_TABLE (系统表) EFI_SYSTEM_TABLE 是一个指针&#xff0c;包含多个服务和系统…