【洛谷P1198】最大数【分块】

2024-01-30 10:32
文章标签 洛谷 最大数 分块 p1198

本文主要是介绍【洛谷P1198】最大数【分块】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目大意:

题目链接:https://www.luogu.org/problemnew/show/P1198
现在请求你维护一个数列,要求提供以下两种操作:

  1. 查询操作。
    语法: Q L Q\ L Q L
    功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。
    限制: L L L不超过当前数列的长度。 ( L > 0 ) (L>0) (L>0)
  2. 插入操作。
    语法: A n A\ n A n
    功能:将 n n n加上 t t t,其中 t t t是最近一次查询操作的答案(如果还未执行过查询操作,则 t = 0 t=0 t=0),并将所得结果对一个固定的常数 D D D取模,将所得答案插入到数列的末尾。
    限制: n n n是整数(可能为负数)并且在长整范围内。

注意:初始时数列是空的,没有一个数。


思路:

M ≤ 200000 M\leq200000 M200000
分块啊。
由于确定了最终数字不会超过 2 × 1 0 5 2\times 10^5 2×105,所以就可以直接确定分成 2 × 1 0 5 \sqrt{2\times 10^5} 2×105 个块,使用计算器得

在这里插入图片描述
在这里插入图片描述
那就将一个块设置成 448 448 448就好了。
对于一个插入操作,判断是否需要建立一个新的块。然后将数据储存进去。
对于一个查询操作,按照朴素的分块求法求 [ n − x + 1 , n ) [n-x+1,n) [nx+1,n)的最大值即可。


代码:

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;const int N=200010;
const int T=448;
int n,m,MOD,x,t,a[N],L[T],R[T],maxn[T],pos[N],ans;
char c;int find_max(int l,int r)  //暴力求l到r的最大值
{int Maxn=-2147483648;for (int i=l;i<=r;i++)Maxn=max(Maxn,a[i]);return Maxn;
}int ask(int l,int r)
{int q=pos[l],p=pos[r];if (q==p) return ans=find_max(l,r);  //直接暴力求int Maxn=max(find_max(l,R[q]),find_max(L[p],r));  //两边暴力求for (int i=q+1;i<p;i++)Maxn=max(Maxn,maxn[i]);return ans=Maxn;
}int main()
{scanf("%d%d",&m,&MOD);while (m--){c=getchar();while (c!='A'&&c!='Q') c=getchar();scanf("%d",&x);if (c=='A'){a[++n]=(int)(((ll)x+(ll)ans)%MOD);  //此处会炸int,切记用long long!if (n%T==1)  //建立新块{t++;L[t]=R[t]=R[t-1]+1;}else R[t]++;pos[n]=t;maxn[t]=max(maxn[t],a[n]);}else printf("%d\n",ask(n-x+1,n));}return 0;
}

题外话

论 随 意 使 用 c i n 的 后 果 论随意使用cin的后果 使cin
在这里插入图片描述

这篇关于【洛谷P1198】最大数【分块】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/659954

相关文章

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

Spring Boot实现大文件分块上传

1.分块上传使用场景 大文件加速上传:当文件大小超过100MB时,使用分片上传可实现并行上传多个Part以加快上传速度。 网络环境较差:网络环境较差时,建议使用分片上传。当出现上传失败的时候,您仅需重传失败的Part。 文件大小不确定: 可以在需要上传的文件大小还不确定的情况下开始上传,这种场景在视频监控等行业应用中比较常见。 2.实现原理 实现原理其实很简单,核心就是客户端把大文件

洛谷P5490扫描线

0是最小的数字,将一个线段看成一个区间,对于一个矩形,从下扫到上,入边为1,而出边为-1,意思是将这个区间上的所有点加1(区间修改).把线段表示为Line[i],其中记录了l,r,h,tag,左右端点,高度,入边还是出边(1或-1) 那么每次区间修改后不为0的区间它的值可能是1,2,3或者是其它数字,这不好统计,可以将它转化一下,0是不是表示没有被覆盖过的地方,我们只要统计0的个数然后用总长减去

【BNU】40719 Arithmetic Progressions【分块+FFT】

传送门:【BNU】40719 Arithmetic Progressions 题目分析: 用分块+FFT强行AC了这题…… 之前一直TLE……然后改了好久把姿势改的优美点了……终于过了…… 大概思路是:我们考虑分块,假设每一块的大小为S,一共分了B块然后我们分两种情况讨论: 1.第二个数在第i块,第一个数在(1~i-1)块内,第三个数在(i+1~B)块内。 2.至少两个数在同一块内。

【HDU】5213 Lucky 【分块(在线算法)】

传送门:【HDU】5213 Lucky 题目分析: 我来说一下这题的在线做法。 首先我们将区间分成 n√ \sqrt n块,用f[x][y]表示第x块的数和第y块的数相加等于K的对数,这个可以 O(nn√) O(n \sqrt n)的预处理。然后还有g[x][y]表示在第1~x块中有的大小为y的数的个数,这个的复杂度同样 O(nn√) O(n \sqrt n)。 接下来,对于每组询问,我们

挤牛奶洛谷uasco

题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒。第二个农民在700秒开始,在 1200秒结束。第三个农民在1500秒开始2100秒结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300秒到1200秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200秒到1500秒)。

针对大数据的种子点生长——分块生长的策略

前言   在之前的种子点生长系列中,探讨了使用三种提取图像中内容部分种子点生长算法,分别是泛洪法、扫描线法和区段法。我们知道这三种算法在空间上都需要占用三维图像的空间以及相应的位图标记表的空间。有时,我们需要处理一些体积相当大的数据,这些数据都是内存中无法放下的,如数十数百GB的数据,想要获得其中图像内容信息,一般需要对图像进行分块生长。   本文使用一种比较直接的思路对数据进行分块,然

P3313 [SDOI2014] 旅行(分块做法)

~~~~~      P3313 [SDOI2014] 旅行 ~~~~~      总题单链接 思路 ~~~~~      遇到这种树上路径问题,就考虑用重链剖分转为区间问题。 ~~~~~      问题转换为了:给定一个区间和 k k k,求这个区间内信仰为 k k k 的城市的 权值和 或 最大权值。 ~~~~~      这个问题也可以用动态开点线段树解决(现在不会,以后